ListBox实现了IPostBackDataHandler但是当EnableViewState设置为false时,为什么它不能像TextBox一样维护它的状态?

时间:2015-12-19 22:37:05

标签: c# asp.net webforms postback viewstate

在这篇文章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");
}

2 个答案:

答案 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中隐式定义。

enter image description here

答案 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中的选项列表)都需要启用视图状态才能在回发中保留它。