Markup看起来像这样:
<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 :(得分: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