2014-08-29 1 views
2

마크 업은 다음과 같습니다viewstate가 문제

<form id="form1" runat="server"> 

    <asp:TextBox ID="txt1" runat="server"></asp:TextBox> 
    <asp:Button ID="Button1" runat="server" Text="Do Something" /> 

</form> 

코드 뒤에 다음과 같습니다

protected void Page_Load(object sender, EventArgs e) 
    { 
     if (!Page.IsPostBack) 
     txt1.Visible = false; 

     Form.Controls.AddAt(0, new TextBox() { ID = "blah", Text = "blah", EnableViewState = true }); 
    } 

문제는 그 나는 버튼, txt1을 클릭하면 비록 그것이 숨겨진 것에 대한 가시성을 설정했다 할지라도 다시 볼 수있게됩니다. Viewstate는 숨김 상태로 유지해야하지만 어떤 이유로 인해 표시되지 않습니다.

중요 :이 문제는 Form.Controls.AddAt를 사용하여 컨트롤을 동적으로 추가 할 때만 발생합니다. 이렇게하면 동적으로 추가 된 컨트롤 뒤에 모든 컨트롤에 대한 viewstate가 엉망이되는 것 같습니다.

왜 그런가? 또는 페이지의 모든 후속 컨트롤에 대해 viewstate를 엉망으로 만들지 않고 AddAt를 사용하는 방법?

+0

당신이 초기화에 텍스트 상자를 추가 할 수 있습니다

페이지 수명주기와의 ViewState에 대한 추가 정보를 원하시면 여기를 참조하십시오? – Stilgar

+0

폼에 PlaceHolder 컨트롤을 추가하고 AddAt를 사용하는 대신 컨트롤에 컨트롤을 추가하면 어떻게됩니까? – Stilgar

답변

1

Stilgar와 마찬가지로 Init()에 컨트롤을 추가하십시오.

문제는 ViewState가 Init()와 Load() 사이의 컨트롤 색인에 따라로드되고 그 지점 이후의 컨트롤 순서가 엉망입니다. 즉, ViewState 메커니즘은 두 번째 TextBox의 Visible 속성을 false로 설정해야한다고 생각하지만 txt1은 해당 평가를 수행하는 첫 번째 TextBox입니다.

이전에는 ViewState가 컨트롤의 ID (FAR 우수/예측 가능한 접근 방식)에 의해로드되었지만 이전 버전의 프레임 워크에서는 ASP.NET 팀이 큰 시간을 보냈습니다. Last event in page that can still affect a page's viewstate

관련 문제