2014-08-29 144 views
2

标记看起来是这样的:视图状态的问题时,在ASP.net动态添加控件

<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动态添加控件时才会发生这种情况。这样做似乎搞乱了动态添加控件之后所有控件的视图状态。

任何想法为什么?或者如何使用AddAt而不会搞乱页面上所有后续控件的视图状态?

+0

您可以添加文本框上初始化? – Stilgar 2014-08-29 21:06:31

+0

此外,如果将PlaceHolder控件放在窗体中并将其放在控件中,而不是使用AddAt – Stilgar 2014-08-29 21:10:22

回答

1

就像Stilgar说的那样,将控制添加到Init()中。

问题是ViewState根据Init()和Load()之间的控件的索引进行加载,并且在此之后你就搞乱了控件的顺序。换句话说,ViewState机制认为它需要将第二个TextBox的Visible属性设置为false,但txt1是它进行评估时的第一个TextBox。

它曾经是ViewState由控件的ID加载(这是一种FAR优越/更可预测的方法),但是ASP.NET团队在更新版本的框架中让事情变得更加糟糕。

在这里看到在页面生命周期和ViewState的更多信息: Last event in page that can still affect a page's viewstate