ASP.NET ViewState的工作原理

ASP.NET ViewState的工作原理,asp.net,viewstate,Asp.net,Viewstate,我的.aspx页面上有一个文本框和按钮。文本框的EnableViewState属性设置为false。但是当我在文本框中输入一些文本并单击按钮时,输入的文本仍然存在于文本框中。我希望文本框为空,因为EnableViewState设置为false。我遗漏了什么吗?请检查以更好地理解ViewState和回发数据 有点像: 为什么某些控件保留值 即使在禁用ViewState之后 而其他人则不然? 答案是控制哪一个 实现IPostBackEventHandler IPostBackDataHandler,

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

请检查以更好地理解ViewState和回发数据

有点像:

为什么某些控件保留值 即使在禁用ViewState之后 而其他人则不然?

答案是控制哪一个 实现IPostBackEventHandler IPostBackDataHandler,如 文本框、复选框等将保留 即使在禁用 视图状态。原因是在 加载回发数据阶段,这些 控件将获取状态信息 从邮寄回来的表格

但是像label这样的控件却没有 实现IPostBackEventHandler IPostBackDataHandler将 无法从中获取任何状态信息 回发数据,因此取决于 完全依赖viewstate来维护 国家

下面是与你的问题相关的一段

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

  • 加载视图状态:此阶段遵循的是 页面生命周期。在这个阶段,, 视图中保存的视图状态信息 上一次回发加载到 控制。因为没有必要检查 并在页面打开时加载以前的数据 是今年第一次加载的 这一阶段不会发生。在随后的 尽可能地回发页面 控件的以前数据 佩奇将经历这个阶段

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

  • 加载回发数据阶段:尽管此阶段与 ViewState,它会导致大多数 开发者之间的误解。这 阶段仅在页面已完成时发生 我已经发回了。ASP.NET控件 哪个实现了IPostBackEventHandler IPostBackDataHandler 将从中更新其值(状态) 适当的回发数据。这个 需要注意的重要事项 现阶段情况如下:

  • 控件的状态(值)不是从ViewState检索的,而是从 寄回表格
  • Page类将只向那些 执行以下操作的控件: IPostBackEventHandler IPostBackDataHandler
  • 此阶段遵循负载视图状态阶段,换句话说,状态 加载视图期间设置的控件 状态阶段将在中被覆盖 这个阶段
这是故意的

即使控件ViewState(EnableViewState属性)设置为False,以下服务器控件也会跨请求保留其信息:

* The TextBox control.
* The CheckBox control.
* The RadioButton control.
发生这种行为是因为控件的ViewState只是用于跨请求持久化控件属性的方法之一。在“症状”部分提到的服务器控件中,通常不通过表单get或表单post发布到服务器的属性由ViewState处理。这些值包括控件的属性,例如背景色。通常发布到服务器的属性由IPostBackDataHandler接口处理。此类属性的一个示例是CheckBox控件的checked属性

也请阅读本文

为了理解Viewstate,我认为没有比MSDN更好的文章了

看一看

即使控件ViewState(EnableViewState属性)设置为False,以下服务器控件也会跨请求保留其信息:

* The TextBox control.
* The CheckBox control.
* The RadioButton control.
  • 文本框控件
  • 复选框控件
  • 无线电按钮控制
发生这种行为是因为控件的ViewState只是用于跨请求持久化控件属性的方法之一。在前面提到的服务器控件中,通常通过表单get或表单post发布到服务器的属性由ViewState处理。这些值包括控件的属性,例如背景色

通常发布到服务器的属性由IPostBackDataHandler接口处理。此类属性的一个示例是CheckBox控件的checked属性

<强>示例< /强>:以编程方式考虑背景色设置。回发时,如果关闭viewstate,则Textbox控件的背景色将丢失。但是,将保留控件的文本值

注意:如果背景色是直接在标记中设置的,而不是在代码隐藏中设置的,那么它将一直存在

<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;

    }
}

:

在开发人员中,一个常见的误解是视图状态在某种程度上负责让文本框、复选框、下拉列表和其他Web控件在回发过程中记住它们的值。事实并非如此,因为这些值是通过回发表单字段值标识的,并在LoadPostData()方法中为那些实现IPostBackDataHandler的控件分配的

服务器控件可以通过实现
IPostBackDataHandler接口
指示它有兴趣检查回发的数据。在页面生命周期的这个阶段,page类枚举
回发表单字段
,并搜索相应的服务器控件。如果找到该控件,它将检查该控件是否实现IPostBackDataHandler接口。如果是,则通过调用服务器控件的LoadPostData()方法将适当的回发数据传递给服务器控件。然后,服务器控件将根据此回发数据更新其状态

也参考