【发布时间】:2011-06-04 11:09:57
【问题描述】:
我以为我理解 ViewState,但这有点奇怪。
我有一页有 1000 个标签和文本框,如下所示:
<dt>
<asp:Label runat="server" ID="Label1" AssociatedControlID="TextBox1">Label1</asp:Label>
</dt>
<dd>
<asp:TextBox runat="server" ID="TextBox1"></asp:TextBox>
</dd>
全部递增 1。我在顶部添加了一个按钮:
<asp:Button runat="server" ID="PostBack" Text="Post it all back!" OnClick="ChangeValues"/>
对应的代码是:
protected void ChangeValues(object sender, EventArgs e)
{
for (int i = 1; i <= 1000; i++)
{
string textBoxId = "TextBox" + i;
((TextBox)Page.FindControl(textBoxId)).Text = textBoxId;
}
}
所以我的理解是:
- 首次页面加载,控件最初设置,因此未创建控件视图状态
- 在回发时,单击按钮正在修改控件。因此,在生成 ViewState 时,.NET 会意识到文本已从默认值更改,并将其记录在视图状态中。
现在对于 1000 个控件,您会期望它相当大,比这大得多:
<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwUJNjYzODc0MDE1ZGQRGHqYtZTbbkevIfg33I4Wja+xfz0at0+fDMS72BtZNA==" />
我想我在这里错过了一个技巧。我打开了Trace=true,并注意到所有的 ViewState 仍然是 0 字节。 EnableViewState 和 ViewStateMode 未在 <@Page 指令中声明,因此 ViewState 处于打开状态并正常工作。
谁能帮我理解为什么我会误解这是如何工作的?
【问题讨论】:
-
我正在尝试了解您在网页上使用 1,000 多个控件可能会做什么。
-
这只是一个极端的例子,如果你愿意,你可以将它减少到 50 - 或者 2。它仍然会发生。
-
哇,听到这个我松了一口气。
标签: c# viewstate asp.net-4.0