繁体   English   中英

在ASP.net中动态添加控件时的Viewstate问题

[英]Viewstate issue when dynamically adding controls in 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而不会弄乱页面上所有后续控件的视图状态?

就像Stilgar所说,在Init()中添加控件。

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

过去,ViewState是由控件的ID加载的(这是一种FAR优越/更可预测的方法),但是ASP.NET团队在更新版本的框架中花了大量时间。

有关页面生命周期和ViewState的更多信息,请参见此处: 页面中的最后一个事件仍然可以影响页面的视图状态

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM