【发布时间】:2013-03-01 13:20:15
【问题描述】:
我的 .aspx 页面上有一个文本框和按钮。文本框的 EnableViewState 属性设置为 false。但是当我在文本框中输入一些文本并单击按钮时,输入的文本仍然存在于文本框中。我希望文本框为空白,因为 EnableViewState 设置为 false。我错过了什么吗?
【问题讨论】:
我的 .aspx 页面上有一个文本框和按钮。文本框的 EnableViewState 属性设置为 false。但是当我在文本框中输入一些文本并单击按钮时,输入的文本仍然存在于文本框中。我希望文本框为空白,因为 EnableViewState 设置为 false。我错过了什么吗?
【问题讨论】:
请查看this Code Project article 以更好地了解 ViewState 和回发数据。
有点像:
为什么有些控件会保留值 即使在禁用 ViewState 之后 而其他人则没有?
答案是控制 实现
IPostBackEventHandlerIPostBackDataHandler 之类的 Textbox、Checkbox等会保留 即使在禁用后的状态 视图状态。原因是在 加载回发数据阶段,这些 控件将获取状态信息 来自回发表格。但是像标签这样的控件却没有 实现
IPostBackEventHandlerIPostBackDataHandler 将 没有得到任何状态信息 回发数据,因此依赖 完全在 viewstate 上维护 状态。
以下是与您的问题相关的段落。
在页面生命周期中,有两个事件是 与 ViewState 关联:
加载视图状态:这个阶段在初始化阶段之后 页面生命周期。在这个阶段, ViewState 信息保存在 以前的回发被加载到 控制。因为不需要检查 并加载以前的数据,当页面 第一次加载这个 阶段不会发生。在随后 回发页面,因为可能有 以前的控制数据, 页面将经历这个阶段。
保存视图状态:此阶段先于页面的呈现阶段。 在这个阶段,当前状态 (值)控件被序列化为 64 位编码字符串并保留在 中的隐藏控件(__ViewState) 页面。
Load Postback Data 阶段:虽然这个阶段与 ViewState,它导致大多数 开发者之间的误解。这个 阶段仅在页面具有 被发回了。 ASP.NET 控件 实现
IPostBackEventHandlerIPostBackDataHandler 将从 适当的回发数据。这 需要注意的重要事项 阶段如下:
- 控件的状态(值)不是从 ViewState 中检索的,而是从 发回表单。
- 页面类只会将回发的数据交给那些 控制实施
IPostBackEventHandlerIPostBackDataHandler.- 此阶段在 Load View State 阶段之后,即 在加载视图期间设置的控件 状态阶段将被覆盖 这个阶段。
【讨论】:
这是设计使然
即使控件 ViewState(EnableViewState 属性)设置为 False,以下服务器控件也会在请求中保留其信息:
* The TextBox control.
* The CheckBox control.
* The RadioButton control.
出现此行为是因为控件的 ViewState 只是用于跨请求保持控件属性的方法之一。在“症状”部分提到的服务器控件中,通常不会通过 form-get 或 form-post 发布到服务器的属性由 ViewState 处理。这些值包括控件的属性,例如 BackColor。通常发布到服务器的属性由 IPostBackDataHandler 接口处理。 CheckBox 控件的选中属性就是此类属性的一个示例。
也阅读这篇文章
ASP.NET: TextBox and EnableViewState="False"
对于 Viewstate 的理解,我认为没有比 MSDN 更好的文章了
【讨论】:
看看Server controls persist their state when EnableViewState is set to False
即使控件 ViewState(EnableViewState 属性)设置为 False,以下服务器控件也会在请求中保留其信息:
出现此行为是因为控件的 ViewState 只是用于跨请求保持控件属性的方法之一。在提到的服务器控件中,不通常通过 form-get 或 form-post 发布到服务器的属性由 ViewState 处理。这些值包括控件的属性,例如 BackColor。
通常发布到服务器的属性由 IPostBackDataHandler 接口处理。 CheckBox 控件的选中属性就是此类属性的一个示例。
示例:考虑以编程方式设置背景色。在回发时,如果关闭视图状态,则 Textbox 控件的 background color 将丢失。但是,控件的文本值保持不变。
注意:如果背景色是直接在标记中而不是在后面的代码中设置的,它会保持不变。
<form id="form1" runat="server">
<asp:TextBox ID="Textbox1" runat="server" EnableViewState="false"></asp:TextBox>
<asp:Button ID="Button1" runat="server" Text="Button" EnableViewState="false" />
</form>
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
this.Textbox1.BackColor = Color.Yellow;
}
}
以下来自Understanding ASP.NET View State:
开发人员普遍存在一种误解,即视图状态以某种方式负责让 TextBox、CheckBox、DropDownList 和其他 Web 控件在回发过程中记住它们的值。情况并非如此,因为这些值是通过回发的表单字段值标识的,并在 LoadPostData() 方法中为那些实现 IPostBackDataHandler 的控件分配。
服务器控件可以通过实现
IPostBackDataHandler interface来表明它有兴趣检查回发的数据。在页面生命周期的这个阶段,Page 类枚举posted back form fields,并搜索相应的服务器控件。如果找到该控件,它会检查该控件是否实现了 IPostBackDataHandler 接口。如果是这样,它将通过调用控件的 LoadPostData() 方法将适当的回发数据传递给服务器控件。然后,服务器控件将根据此回发数据更新其状态。
也可以参考以下
【讨论】: