ASP.NET ViewState的工作原理

7 asp.net viewstate

我的.aspx页面上有一个文本框和按钮.文本框的EnableViewState属性设置为false.但是当我在文本框中输入一些文本并单击按钮时,输入的文本仍然存在于文本框中.我希望文本框为空,因为EnableViewState设置为false.我错过了什么吗?

MRG*_*MRG 7

请查看此Code Project文章以更好地了解ViewState和Postback Data.

它是这样的:

为什么某些控件即使在禁用ViewState后仍会保留值,而其他控件却没有?

答案是实现IPostBackEventHandler的控件IPostBackDataHandler,如Textbox,Checkbox等,即使在禁用viewstate之后也会保留状态.原因是在Load Postback Data阶段,这些控件将从Posted back表单中获取状态信息.

但是没有实现IPostBackEventHandler IPostBackDataHandler的标签之类的控件将不会从发回的数据中获取任何状态信息,因此完全依赖于viewstate来维护状态.

以下是与您的问题相关的段落.

在页面生命周期中,两个事件与ViewState关联:

  • 加载视图状态:此阶段遵循页面生命周期的初始化阶段.在此阶段,保存在上一个回发中的ViewState信息将加载到控件中.由于无需检查和加载以前的数据,因此当第一次加载页面时,此阶段将不会发生.在页面的后续回发中,因为可能存在控件的先前数据,页面将经历该阶段.

  • 保存视图状态:此阶段位于页面的呈现阶段之前.在此阶段,控件的当前状态(值)被序列化为64位编码字符串并保留在页面中的隐藏控件(__ViewState)中.

  • 加载回发数据阶段:虽然这个阶段与ViewState无关,但它会引起开发人员的大部分误解.此阶段仅在页面回发后发生.实现IPostBackEventHandler的 ASP.NET控件IPostBackDataHandler将从适当的回发数据更新其值(状态).关于这个阶段需要注意的重要事项如下:

    1. 控件的状态(值)不是从ViewState检索的,而是从回发的表单中检索的.
    2. Page类会将发回的数据移交给那些实现IPostBackEventHandler IPostBackDataHandler的控件 .
    3. 此阶段遵循"加载视图状态"阶段,换句话说,在"加载视图状态"阶段中设置的控件状态将在此阶段被覆盖.