Ajax 타이머 컨트롤을 사용할 때 내 페이지 클래스의 인스턴스 멤버에 쓰려고 할 때 문제가 발생했습니다. 내가 아주 간단한 원유 예를 구축 한Ajax TimerControl 및 Instance 변수?
는 아래 내가 보내고있어 정확한 문제 ...
아래 코드는 "UPDATETEXT"모든 두 번째 타이머 제어를 사용하여 호출하는 방법을 실행을 에뮬레이트합니다. 메서드가 호출 될 때마다 타이머 컨트롤이 콜백을 수행 한 횟수를 보여주기 위해 카운터 변수를 하나씩 증가시킵니다.
물론 카운터 값을 웹 페이지로 읽으려면 레이블이 타이머에 연결된 트리거로 업데이트 패널 안에 있습니다.
마크 업 :
<form id="form1" runat="server">
<div>
<asp:ScriptManager ID="ScriptManager1" runat="server">
</asp:ScriptManager>
<asp:Timer ID="Timer1" runat="server" Interval="1000" OnTick="UpdateText">
</asp:Timer>
<asp:UpdatePanel ID="UpdatePanel1" runat="server">
<ContentTemplate>
<asp:Label runat="server" Text="" ID="lblCounter"></asp:Label>
</ContentTemplate>
<Triggers>
<asp:AsyncPostBackTrigger ControlID="Timer1" />
</Triggers>
</asp:UpdatePanel>
</div>
</form>
코드 숨김 :
public partial class TimerControl : System.Web.UI.Page
{
private static int loopCounter = 0;
protected void Page_Load(object sender, EventArgs e)
{
}
public void UpdateText(object sender, EventArgs e)
{
lblCounter.Text = loopCounter.ToString();
loopCounter++;
}
}
이를 실행하면 당신은 훌륭한, 작동 찾을 수 있습니다하지만 난 'loopCounter'변수를 원하지 않는다 이것이 전체 애플리케이션 레벨에 적용되고 모든 사용자가 동일한 변수에 읽고 쓸 수 있기 때문에 정적이어야합니다.
정적 키워드를 제거하려고하면 loopCounter 변수가 더 이상 업데이트되지 않고 단지 0으로 유지됩니다 ... 코드 나 브라우저 (JavaScript)에 오류가 없습니다.
정상적으로 작동하고 사용자 컨텍스트에 남아있는 대신 세션을 사용하여 임시 해결 방법을 찾았지만 실제로해야하지 않는 한 세션을 사용하지 않는 것이 좋습니다. 에 '예'회원이이 같은 에 기록 할 수없는 이유
는 사람이 설명해 주시겠습니까? 왜 그것은 정적으로 만 작동합니까?
답변 해 주셔서 감사합니다. 그래서 언제 (Ajax를 제외하고) 버튼을 통해 일반적인 포스트 백이 만들어지면 페이지의 새로운 '인스턴스'가 생성되는 것일까? 이것은 내가 보는 행동을 설명 할 것입니다. Viewstate도 좋은 선택입니다. 감사합니다. – Dal
사실, aspx 페이지에 대한 모든 요청 (Ajax 또는 일반)은 새 페이지 인스턴스에 의해 처리됩니다. –