Asp.net 视图状态与回发

Asp.net 视图状态与回发,asp.net,custom-server-controls,page-lifecycle,Asp.net,Custom Server Controls,Page Lifecycle,我想我回答了我自己的问题,但我想确保我理解正确。我最初认为,当用户在表单中提供值时,在回发时,这些值是作为Viewstate的一部分提交的,因为TextBox.Text是Viewstate的一部分。现在我发现,用户提供的值实际上在OnLoad事件之后才应用于控件。这让我很困惑,因为我认为viewstate是在OnLoad之前(或者在调用controls.Add()时)加载到控件中的。我已经阅读了页面和控件生命周期上的文档几次,我刚刚意识到处理回发数据有一个不同的步骤(这一步骤在很多文档中都没有出

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

1) 那么回发数据,用户在字段中的类型值,在OnLoad事件之后应用,而Viewstate数据在OnLoad事件之前应用

2) 因此,本质上所有这一切意味着,在回发时,服务器为TextBox.Text属性获取两个值,一个在Viewstate中,类似于前一个请求中的“旧”值,另一个是用户在表单中提供的新值

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

4) viewstate数据是否在客户端被修改过?或者viewstate是否与服务器在上一个请求中发送的内容相同(假设没有篡改)?我的印象是,服务器将所有控件属性编码到viewstate中,在客户端,当用户提交表单时,viewstate字段被解码、修改、编码,并在修改后提交到服务器。我以为有一群javascript在为我做这一切。现在我想我全错了。取而代之的是,客户端上的Viewstate似乎从未更改,所有客户端更改都在回发数据中,因此服务器的下一个请求加载Viewstate、加载回发,并在下一个响应中提供新的更新Viewstate?

1)这两个都是在加载之前加载的
2) 基本上,是的
3) 首先应用ViewState,然后发布数据

引用斯科特·米切尔的话(见下文)

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

4) 除非您是以开箱即用的方式进行操作,否则ViewState永远不会在客户端进行修改。“ViewState”是一个HTML表单字段,在服务器端进行处理

这里有一些来自by的图片可能会对你有所帮助


(来源:)


(来源:)

额外阅读材料:

我以前的印象是服务器对所有控件进行编码 属性转换为viewstate,并且当用户 提交表单后,viewstate字段被解码、修改, 编码,并提交到服务器进行修改

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

当客户端选择下拉框或更改文本框中的文本时,hidden 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.

-斯科特·米切尔(Scott Mitchell)

我只浏览了大约10%的“奖励阅读材料”链接,到目前为止,这是一个非常好的信息。再次感谢!我已经阅读了5次真正理解Viewstate的文章,当我感到困惑时,我总是会回到这篇文章上来。:)