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

C# 在ASP.net中动态添加控件时的Viewstate问题,c#,asp.net,viewstate,C#,Asp.net,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, EventArg

标记如下所示:

<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


你知道为什么吗?或者如何使用AddAt而不破坏页面上所有后续控件的viewstate?

如Stillgar所说,将控件添加到Init()中

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

过去,ViewState是由控件的ID加载的(这是一种非常好的/更可预测的方法),但是ASP.NET团队在更新版本的框架中把事情搞砸了

有关页面生命周期和视图状态的更多信息,请参见此处:

能否在Init上添加文本框?如果在表单中放置占位符控件,而不是使用AddAt,又会发生什么情况