Viewstate vs Postback

时间:2010-06-01 21:45:48

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

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

1)因此,在OnLoad事件之后应用回发数据(用户在字段中输入的值),并在OnLoad事件之前应用Viewstate数据吗?

2)所以基本上所有这些意味着在回发时服务器获取TextBox.Text属性的两个值,Viewstate中的属性,就像前一个请求中的“旧”值,以及由表单中的用户?

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

4)是否在客户端根本修改了viewstate数据?或者视图状态与服务器在先前请求中发送的内容相同(假设没有篡改)?我的印象曾经是服务器将所有控件属性编码到视图状态中,而在客户端提交表单时,视图状态字段被解码,修改,编码并提交给服务器并进行修改。我假设有一堆javascript为我做这一切。现在我觉得我错了。相反,Viewstate似乎永远不会在客户端更改,并且所有客户端更改都在回发数据中,以便下一个请求服务器加载视图状态,加载回发,并在下一个响应中提供新的更新视图状态?

2 个答案:

答案 0 :(得分:12)

1)两者都在装载前加载 2)基本上,是的 3)首先应用ViewState,然后应用Post Data

引用Scott Mitchell(见下文)

  

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

4)除非你在框外做某事,否则ViewState永远不会被修改为客户端。 “ViewState”是一个HTML表单字段,在服务器端进行处理。

以下是来自Understanding ASP.NET View State Scott Mitchell的一些图片,可能对您有帮助。

alt text http://i.msdn.microsoft.com/ms972976.viewstate_fig02%28en-us,MSDN.10%29.gif alt text http://i.msdn.microsoft.com/ms972976.viewstate_fig04%28en-us,MSDN.10%29.gif

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

答案 1 :(得分:0)

  

我的印象曾经是服务器编码了所有控件   属性进入viewstate,并在客户端进入用户时   提交表单后,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.

- 斯科特·米切尔