2010-07-18 3 views
3

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)에 오류가 없습니다.

정상적으로 작동하고 사용자 컨텍스트에 남아있는 대신 세션을 사용하여 임시 해결 방법을 찾았지만 실제로해야하지 않는 한 세션을 사용하지 않는 것이 좋습니다. 에 '예'회원이이 같은 에 기록 할 수없는 이유

는 사람이 설명해 주시겠습니까? 왜 그것은 정적으로 만 작동합니까?

답변

2

이는 http가 stateless 프로토콜이기 때문에 발생합니다. 문제의 구체적인 이유는 요청이 완료된 후에 페이지의 인스턴스가 메모리에 보관되지 않는다는 것입니다. ASP.NET 페이지에 요청할 때마다 새 페이지 인스턴스가 만들어집니다. 페이지 클래스에 기본 생성자를 추가하고 거기에 중단 점을 넣으면 쉽게 확인할 수 있습니다.

세션 상태 이외에도 viewstate을 사용할 수도 있습니다. 이 경우 사용자가 사용하는 데이터 (사용자 카운터)가 특정 페이지가 아니기 때문에 더 나은 솔루션 일 것입니다.

+0

답변 해 주셔서 감사합니다. 그래서 언제 (Ajax를 제외하고) 버튼을 통해 일반적인 포스트 백이 만들어지면 페이지의 새로운 '인스턴스'가 생성되는 것일까? 이것은 내가 보는 행동을 설명 할 것입니다. Viewstate도 좋은 선택입니다. 감사합니다. – Dal

+0

사실, aspx 페이지에 대한 모든 요청 (Ajax 또는 일반)은 새 페이지 인스턴스에 의해 처리됩니다. –