当Request对象中包含所有字段值时,为什么需要ViewState?

Dan*_*han 5 c# asp.net viewstate request

每当我们提交表单时,所有字段值都会发布到服务器并在Request对象中可用.理想情况下,可以使用相同的对象来读取值并使用它执行任何操作.

那么,为什么我们需要ViewState来保存字段的值?

请原谅我的无知,我想我错过了一些非常明显的事情,但是无法弄清楚是什么.

yor*_*rah 5

在ASP.Net中引入ViewState的最明显原因是为了允许类似winform的编程模型(基于事件).

当您有服务器端控件(例如文本框)时,发送回浏览器的html页面包含:

  • 控件的初始值,在viewstate中编码=>此值不能被浏览器/用户修改
  • 控件本身=>浏览器/用户可以修改其状态

当表单提交回服务器时,ASP.Net底层引擎会将控件新值与存储在ViewState中的初始值进行比较.如果它不相同,将触发OnChange事件,您可以像在winform应用程序中那样附加到它.


Stu*_*tLC 3

根据 V4Vendetta,您可以禁用控件上的 ViewState,但是您需要手动开发“ASP 经典样式”,例如,如果您需要将用户保留在页面上并且表单验证失败,则需要设置初始值恢复为用户上次设置的值,否则用户数据将丢失。

ASP Net 控件通过在 ViewState 中保留此信息来更优雅地处理此问题。但是,如果您永远不需要再次呈现控件,或者每次都从新呈现控件数据而不需要其先前的状态(例如分页网格),那么禁用控件的 ViewState 将节省您的带宽。

这里对 ViewState 有很好的解释。