2011-03-08 5 views
0

저는 ASP.NET에서 시작했습니다. 시작하기 만하면됩니다. 아주 간단한 질문이 있습니다. 단추가 있고 단추를 클릭하면 간단한 텍스트가 드롭 다운 상자에 추가됩니다. 코드는 다음과 같습니다.ASP.NET - 일부 멤버 변수가 예상대로 작동하지 않습니까?

public partial class _Default : System.Web.UI.Page 
{ 
    private int buttonclickedtimes = 1; 
    protected void Page_Load(object sender, EventArgs e) 
    { 
    } 
    protected void Button1_Click(object sender, EventArgs e) 
    { 
     this.DropDownList1.Items.Add(new System.Web.UI.WebControls.ListItem("Clickin' mah buttonz " + buttonclickedtimes + " times!")); 
     buttonclickedtimes++; 
    } 
} 

그러나 항상 buttonclickedtimes이 하나입니다. 변수를 정적으로 만들면 의도 한대로 작동합니다. 그러나 DropDownList은 멤버 변수이며 예상대로 올바르게 작동합니다. 나는이 동작을 이해하지 못한다. 모든 멤버 변수는 요청간에 저장되거나 저장되지 않는다. VS2010에서 디버그 모드로 실행 중입니다.

답변

3

아니요 멤버 변수는 요청간에 저장되지 않습니다. 저장하려는 경우 Viewstate에 저장해야합니다.

컨트롤 상태는 Viewstate에 저장되어 있으므로 (보기 상태가 활성화 된 경우) 요청간에 저장되는 이유입니다.

ViewState.Add("buttonClickTracker", buttonclickedtimes);

을 그리고 액세스 :

Pre_Render 방법에 다음을 추가, viewstate가에 저장하려면

buttonclickedTimes = Viewstate["buttonClickTracker"];

+0

감사합니다. 대답을 고르기가 어려웠지만, 이것이 최고라고 느낍니다. – Puppy

0

페이지 수명주기 "문제"가 발생합니다. 그러면 페이지가 생성되고 buttonclickedtimes가 초기 값인 1로 설정됩니다. 그런 다음 페이지 수명주기 (init,로드, 이벤트 핸들링, 렌더링 등)를 거치고 변수에 대한 메모리 할당이 해제됩니다. 그러나 변수가 정적 인 경우 서버는 변수에 대한 메모리 할당에 매달려 있으며 변경 사항은 지속됩니다. 그러나 해당 정적 변수는 해당 페이지에 대해 유지됩니다. 버튼을 클릭 한 x 사용자의 경우 해당 변수가 x 번 증가합니다.

단일 사용자 인스턴스에 대해 변수를 유지하려면 ViewState 또는 Session 상태를 사용하여 정보를 저장할 수 있습니다.

희망이 있으면 도움이됩니다.

1

asp.net 웹 폼을 사용한다고 가정합니다. 여기에 서버에 게시 할 때마다 기본적으로 새 요청이고 페이지가로드되고 다시 초기화됩니다.

그래서 여러 요청간에 데이터를 보존하려는 경우 sesison 변수와 같은 메커니즘을 사용하여 저장해야합니다.

예 : Session["ButtonClickedTimes"] +=1;은 요청할 때마다 값을 증가시킵니다.

0

웹 응용 프로그램은 stateless이므로 ...페이지를 다시로드 할 때마다 변수를 시작합니다. 그 이유는 우리가 Page.IsPostback을 확인했기 때문입니다.

상태를 들어,

이 이

정적 클래스 하나 intance을 가지고 있고 따라서 그들은 내가 희망

... 상관없이 페이지가로드의 값을 유지이 당신을 도와줍니다 viewstate가 또는 세션 상태를 .... 사용해야 하나 .

관련 문제