【问题标题】:ASP.NET How ViewState worksASP.NET ViewState 的工作原理
【发布时间】:2013-03-01 13:20:15
【问题描述】:

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

【问题讨论】:

    标签: asp.net viewstate


    【解决方案1】:

    请查看this Code Project article 以更好地了解 ViewState 和回发数据。

    有点像:

    为什么有些控件会保留值 即使在禁用 ViewState 之后 而其他人则没有?

    答案是控制 实现 IPostBackEventHandler IPostBackDataHandler 之类的 Textbox、Checkbox等会保留 即使在禁用后的状态 视图状态。原因是在 加载回发数据阶段,这些 控件将获取状态信息 来自回发表格。

    但是像标签这样的控件却没有 实现 IPostBackEventHandler IPostBackDataHandler 将 没有得到任何状态信息 回发数据,因此依赖 完全在 viewstate 上维护 状态。

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

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

    • 加载视图状态:这个阶段在初始化阶段之后 页面生命周期。在这个阶段, ViewState 信息保存在 以前的回发被加载到 控制。因为不需要检查 并加载以前的数据,当页面 第一次加载这个 阶段不会发生。在随后 回发页面,因为可能有 以前的控制数据, 页面将经历这个阶段。

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

    • Load Postback Data 阶段:虽然这个阶段与 ViewState,它导致大多数 开发者之间的误解。这个 阶段仅在页面具有 被发回了。 ASP.NET 控件 实现 IPostBackEventHandler IPostBackDataHandler 将从 适当的回发数据。这 需要注意的重要事项 阶段如下:

      1. 控件的状态(值)不是从 ViewState 中检索的,而是从 发回表单。
      2. 页面类只会将回发的数据交给那些 控制实施 IPostBackEventHandler IPostBackDataHandler.
      3. 此阶段在 Load View State 阶段之后,即 在加载视图期间设置的控件 状态阶段将被覆盖 这个阶段。

    【讨论】:

      【解决方案2】:

      这是设计使然

      即使控件 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 更好的文章了

      Understanding ASP.NET View State

      【讨论】:

      【解决方案3】:

      看看Server controls persist their state when EnableViewState is set to False

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

      • TextBox 控件。
      • CheckBox 控件。
      • RadioButton 控件。

      出现此行为是因为控件的 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() 方法将适当的回发数据传递给服务器控件。然后,服务器控件将根据此回发数据更新其状态。

      也可以参考以下

      1. View State for TextBox and other controls that implement IPostBackDataHandler

      2. How do I disable viewstate for a specific control?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-08-13
        • 2016-04-04
        • 2012-03-24
        • 1970-01-01
        • 1970-01-01
        • 2019-01-24
        • 2021-03-20
        • 2011-10-26
        相关资源
        最近更新 更多