Asp.net为什么要用ViewState?
因为浏览器只会提交有Name属性的元素值,像元素的颜色、宽度等属性浏览器并不会传递给服务端,服务端就不可能处理或返回这些值,但客户端是需要这些的,故Asp.net中系统默认会用隐藏元素把相关的信息传递给服务器,这就是Asp.net 的viewstate,它实际是封装了隐藏元素。
ViewState是一种机制,ASP.NET 使用这种机制来跟踪服务器控件状态值,否则这些值将不作为 HTTP 窗体的一部分而回传。例如,由 Label 控件显示的文本默认情况下就保存在 ViewState 中。作为开发人员,您可以绑定数据,或在首次加载该页面时仅对 Label 编程设置一次,在后续的回传中,该标签文本将自动从 ViewState 中重新填充。因此,除了可以减少繁琐的工作和代码外,ViewState 通常还可以减少数据库的往返次数。
ViewState和Cookie一样,是一种客户端的状态保持机制。和Session不同,Session是基于服务端的状态保持机制。当关闭页面的时候ViewState也就不存在了 所以 ViewState 也是保存在浏览器缓存中的,ViewState的作用域是“页面级的”。
ViewState 确实没有什么神秘之处,它是由 ASP.NET 页面框架管理的一个隐藏的窗体字段。当 ASP.NET 执行某个页面时,该页面上的 ViewState 值和所有控件将被收集并格式化成一个编码字符串,然后被分配给隐藏窗体字段的值属性(即 <input type=hidden>)。由于隐藏窗体字段是发送到客户端的页面的一部分,所以 ViewState 值被临时存储在客户端的浏览器中。如果客户端选择将该页面回传给服务器,则 ViewState 字符串也将被回传。
回传后,ASP.NET 页面框架将解析 ViewState 字符串,并为该页面和各个控件填充 ViewState 属性。然后,控件再使用 ViewState 数据将自己重新恢复为以前的状态。
页面本身将 20 字节左右的信息保存在 ViewState 中,用于在回传时将 PostBack 数据和 ViewState 值分发给正确的控件。因此,即使该页面或应用程序禁用了 ViewState,仍可以在 ViewState 中看到少量的剩余字节。
无状态Http
无状态的根本原因是:浏览器和服务器使用Socket通信,服务器将请求结果返回给浏览器后,会关闭当前Socket连接。而且服务器会在处理页面完毕后销毁页面对象。
应用层面的原因是:浏览器和服务器之间通信都遵守HTTP协议。
一个浏览者发出的请求都是由实现了IHttpHandler接口的对象进行响应,由于下次访问不一定还是上次那个对象进行响应,上次响应完毕对象可能已经被销毁了,写的类变量值早就不存在了,因此不能将状态信息保存到类变量中。
如果要知道上一次的状态信息,我们就得把这个状态信息记录在某个地方:
a.服务器端Session
b.浏览器端Cookie
c. 表单元素中—如:隐藏域<input type=“hidden”/>(Http报文)ViewState
四个重要的
ViewState:
ASP.NET 的 .aspx页面特有,页面级的;
就是在页面上的一个隐藏域中保存客户端单独使用的数据的一种方式;
服务器端控件的值都自动保存在ViewState中;
Cookie:
HTTP协议下的一种方式,通过该方式,服务器或脚本能够在客户机上维护状态信息;
就是在客户端保存客户端单独使用的数据的一种方式;
就像你的病历本一样,医院直接给你带回家;
Session:和.Net提供的辅助进程相关。
在服务器端保存客户端单独使用的数据的一种方式;
就像银行账户,钱都存在银行里,你就拿一张银行卡【所谓的SessionId】回家(写入客户端的Cookie中);
Application:
在服务器端保存共享数据的一种方式;
就像银行的单人公共卫生间,谁进去都行,但一次去一个,进去了就锁上门,出来再把锁打开;
ViewState(页面级)
使用方式: 作用域---页面级