在这篇文章Understanding ASP.NET View State中,作者说:
开发人员普遍存在一种误解,即视图状态在某种程度上负责让TextBox,CheckBoxes,DropDownLists和其他Web控件在回发时记住它们的值。情况并非如此,因为值是通过回发表单字段值标识的,并且在LoadPostData()方法中为实现IPostBackDataHandler的控件分配。
因此,当我禁用TextBox的视图状态时,它仍然会在回发后保持其文本值,这基于上面的描述是正确的。
但是,当我禁用ListBox的视图状态时,它也会实现IPostBackDataHandler,它不会在回发中保持其状态。例如,下面提供的代码应该在单击按钮(在同一个webform中)时添加重复项(使用空事件处理程序),但它不会。
我在这里错过了什么吗?
protected void Page_Load(object sender, EventArgs e)
{
lbox.Items.Add("1");
lbox.Items.Add("2");
lbox.Items.Add("3");
}
答案 0 :(得分:2)
我认为答案可以从下图中找到。 (并经过测试)
正如您在第1步中注意到的那样,lblMessage.Text中的值为“Hello World!”,没有提升PostBack事件阶段,因此值保持不变。
<asp:Label runat="server" ID="lblMessage" Font-Name="Verdana" Text="Hello, World!"></asp:Label> <br /> <asp:Button runat="server" Text="Change Message" ID="btnSubmit"></asp:Button> <br /> <asp:Button runat="server" Text="Empty Postback"></asp:Button>
代码隐藏类包含以下事件处理程序 按钮的Click事件:
private void btnSubmit_Click(object sender, EventArgs e) { lblMessage.Text = "Goodbye, Everyone!"; }
接下来,对于文本框即使您禁用特定控件/整页的视图状态,保存的是PostBack事件,这就是为什么如果你看一下第3步,之前的PostBack作为加载视图状态阶段的一部分加载,这使得“Hello World!”已被实例化,被覆盖。
此解释BTW仅适用于不使用DataSource的控件事件,其他需要DataSource的控件似乎在doc中隐式定义。
答案 1 :(得分:1)
在您引用的句子中,“值”一词特指用户提交表单时浏览器向服务器发布的表单字段值。这些值由HTML specification:
定义<input type="text">
元素的TextBox控件,浏览器会发布在文本框中输入的文本。 TextBox控件的IPostBackDataHandler implementation读取此值并将其分配给Text属性。<select>
元素的ListBox控件,浏览器会发布每个所选value
的{{1}}。 (浏览器不发布整个<option>
元素列表。)ListBox控件的IPostBackDataHandler implementation读取这些值并相应地选择/取消选择每个ListItem。 (该实现不添加任何项目。)重要的一点是,无论是启用还是禁用视图状态,浏览器都会发布这些值。因此,即使禁用了视图状态,<option>
和TextBox.Text
也会在回发中保留用户的输入。
但是,浏览器通常不会发布的任何其他内容(例如ListBox中的选项列表)都需要启用视图状态才能在回发中保留它。