【问题标题】:Understanding ViewState and FormData了解 ViewState 和 FormData
【发布时间】:2014-07-25 21:12:00
【问题描述】:
刚开始接触ASP.NET MVC,突然问自己:为什么ASP.NET首先需要ViewState? FormData 实际上在回发中保持状态。 ViewState 仅在控件状态发生更改并且更改不包含在 FormData 中时才需要。例如,如果事件处理程序更改了控件的字体颜色怎么办?
两个问题:
- 对于WebForms,这是需要
ViewState的原因吗?
- 如果是,MVC 如何“维护不在
FormData 中的控件属性”?
【问题讨论】:
标签:
asp.net
asp.net-mvc
forms
viewstate
【解决方案1】:
MVC 和 WebForms 在这方面有很大的不同。 WebForms 的目的是帮助 WinFroms 开发人员轻松进行 Web 开发。出于这个原因,WebForms 的基础架构会尽可能地模拟 statefullness。 ViewState 是其中一种实现方式。由于浏览器只回发表单字段,因此在 WebForms 中,整个页面是一个大表单,整个页面都被发布到服务器。 ViewState 是一个隐藏字段,它保存除了浏览器默认发布的输入、选择等中的数据之外的所有内容。
另一方面,MVC 不会尝试模拟状态完整性。它更直接地与HTTP 和无状态系统的基本规则一起工作。因此,当您发布表单时,只会发布输入、选择等中的数据。没有其他东西可以返回服务器。
这就是为什么,如果您想在更新数据后返回相同的视图,您必须像在原始 get 方法中那样用数据重新填充 ViewModel。 MVC 不像 WebForms 那样为你处理这个问题。
【解决方案2】:
关于为什么首先查看状态,您的解释是相关的。视图状态用于跨 Post Backs 保持状态,主要用于处理以编程方式更新的属性,例如带有标签和按钮的页面,并且您有按钮的事件处理程序将标签正面颜色更改为红色,在页面加载中,控件启动标签使用默认颜色,但是当按钮单击它时,将标签颜色更改为红色并将该更改保持在视图状态中,因此如果有任何触发后返回,则在页面加载中加载控件后,它将前面颜色设置为已保存在内部的值视图状态
更多详情请查看以下链接http://msdn.microsoft.com/en-us/library/ms972976.aspx#viewstate_topic3
MVC 没有视图状态,MVC 基于模型绑定,因此当发布表单时,MVC 框架读取 httprequest 参数并尝试从该请求创建强类型对象,您可以创建自己的模型绑定器来告诉 MVC如何读取http请求