【问题标题】:Viewstate vs Postback视图状态与回发
【发布时间】:2011-02-26 13:41:42
【问题描述】:

我想我有点回答了我自己的问题,但我想确保我理解正确。我最初认为,当用户在表单中提供值时,在回发时这些值是作为 Viewstate 的一部分提交的,因为 TextBox.Text 是 viewstate 的一部分。现在我发现用户提供的值实际上直到 OnLoad 事件之后才应用于控件。这让我很困惑,因为我认为视图状态是在 OnLoad 之前(或在调用 Controls.Add() 时)加载到控件中的。我已经浏览了页面上的文档并控制生命周期几次,我现在才意识到处理回发数据有一个不同的步骤(这个步骤没有出现在很多文档中:(

1) 所以回发数据,即用户输入到字段中的值,是在 OnLoad 事件之后应用的,而 Viewstate 数据是在 OnLoad 事件之前应用的?

2) 基本上所有这一切意味着在回发时,服务器会为 TextBox.Text 属性获取两个值,一个在 Viewstate 中,类似于上一个请求中的“旧”值,而新值由表单中的用户?

3) .net 框架是否应用与 Viewstate 相同的回发数据,因为它通过其 ID 属性找到适当的控件?这很重要,因为我正在动态创建控件,我什至可能有表单会随着时间的推移而改变结构,并且需要考虑如何处理 ID。到目前为止,我还没有设置 ID 属性,一切正常,但以后可能会更复杂。

4) 视图状态数据是否在客户端被修改过?或者视图状态是否与服务器在上一个请求中发送的相同(假设没有篡改)?我以前的印象是服务端将所有的控件属性编码到viewstate中,而在客户端,当用户提交表单的时候,viewstate字段被解码、修改、编码,修改后提交给服务端。我以为有一堆 javascript 为我做这一切。现在我想我错了。相反,客户端的视图状态似乎永远不会改变,所有客户端的更改都在回发数据中,这样服务器的下一个请求会加载视图状态,加载回发,并在下一个响应中提供新的更新视图状态?

【问题讨论】:

    标签: asp.net custom-server-controls page-lifecycle


    【解决方案1】:

    1) 两者都在加载之前加载
    2) 基本上是的
    3) 先应用ViewState,再应用Post Data

    引用 Scott Mitchell(见下文)

    动态添加的控件必须是 以编程方式添加到网页 在每一个页面访问。最好的 添加这些控件的时间是在 页面的初始化阶段 生命周期,它发生在之前 加载视图状态阶段。也就是说,我们 想要拥有控制层次结构 在加载视图状态之前完成 阶段到来。为此,它是 最好创建一个事件处理程序 您的 Page 类的 Init 事件 代码隐藏类,并添加您的 那里有动态控件。

    4) 除非您做一些开箱即用的事情,否则 ViewState 永远不会在客户端进行修改。 “ViewState”是一个 HTML 表单域,在服务器端进行处理。

    这里有几张来自Understanding ASP.NET View State Scott Mitchell 的图片可能会对您有所帮助。


    (来源:microsoft.com


    (来源:microsoft.com

    额外阅读材料:http://weblogs.asp.net/infinitiesloop/archive/2006/08/03/Truly-Understanding-Viewstate.aspx

    【讨论】:

    • 我只浏览了大约 10% 的“Bonus Reading Material”链接,到目前为止,这是非常好的信息。再次感谢!
    • 我已经阅读了大约 5 次真正理解 Viewstate 的文章,当我感到困惑时总是会回来阅读它。 :)
    【解决方案2】:

    我以前的印象是服务器对所有控件进行编码 属性进入视图状态,并在客户端当用户 提交表单,viewstate字段被解码,修改, 编码,并在修改后提交给服务器。

    不,ViewState 的目的只是保留自上次“保存视图状态”页面事件以来页面的状态,即该事件在页面呈现给客户端之前不久发生。

    当客户端对下拉框进行选择或更改文本框中的文本时,隐藏的 ViewState 属性(作为静态 HTML 标记存在于客户端页面上)不会动态更改/编码这些值,它与当该页面最初是呈现的。

    那么如何保留页面的新状态,即如何在 ASP 控件中保留用户下拉选择和文本框值?这些下拉选择和文本框值在回发数据中捕获。

    A server control can indicate that it is interested in examining the posted back data by implementing the IPostBackDataHandler interface. In this stage in the page life cycle, the Page class enumerates the posted back form fields, and searches for the corresponding server control. If it finds the control, it checks to see if the control implements the IPostBackDataHandler interface. If it does, it hands off the appropriate postback data to the server control by calling the control's LoadPostData() method. The server control would then update its state based on this postback data.
    

    - 斯科特·米切尔

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多