状态保存机制之ViewState概述及应用 无状态Http 无状态的根本原因是:浏览器和服务器使用Socket通信,服务器将请求结果返回给浏览器后,会关闭当前Socket连接。而且服务器会在处理页面完毕后销毁页面对象。 应用层面的原因是:浏览器和服务器之间通信都遵守HTTP协议。 一个浏览者发出的请求都是由实现了IHttpHandler接口的对象进行响应,由于下次访问不一定还是上次那个对象进行响应,上次响应完毕对象可能已经被销毁了,写的类变量值早就不存在了,因此不能将状态信息保存到类变量中。 编写一个ashx复制代码 代码如下:private int i; public void ProcessRequest(HttpContext context) { context.Response.ContentType = "text/plain"; context.Response.Write(i++); } 多次刷新我们发现,变量根本不会记忆上次的值。 对网站造成的影响:如果用户录入了一些信息,当跳转到下一个页面时,数据丢失,再也不能获得那些数据。 如果要知道上一次的状态信息,我们就得把这个状态信息记录在某个地方: a.服务器端Session b.浏览器端Cookie c. 表单元素中—如:隐藏域(Http报文)ViewState 四个重要的 ViewState: ASP.NET 的 .aspx页面特有,页面级的; 就是在页面上的一个隐藏域中保存客户端单独使用的数据的一种方式; 服务器端控件的值都自动保存在ViewState中; Cookie: HTTP协议下的一种方式,通过该方式,服务器或脚本能够在客户机上维护状态信息; 就是在客户端保存客户端单独使用的数据的一种方式; 就像你的病历本一样,医院直接给你带回家; Session:和.Net提供的辅助进程相关。 在服务器端保存客户端单独使用的数据的一种方式; 就像银行账户,钱都存在银行里,你就拿一张银行卡【所谓的SessionId】回家(写入客户端的Cookie中); Application: 在服务器端保存共享数据的一种方式; 就像银行的单人公共卫生间,谁进去都行,但一次去一个,进去了就锁上门,出来再把锁打开; ViewState(页面级) 使用方式: 作用域---页面级 保存数据方式:复制代码 代码如下:ViewState["myKey"]="MyData"; 读取数据方式:复制代码 代码如下:String myData; if(ViewState["myKey"]!=null) { myData=(string)ViewState["myKey"]; } ViewState不能存储所有的数据类型,仅支持:String、Integer、Boolean、Array、ArrayList、Hashtable 使用ViewState的前提:页面上必须有一个服务器端窗体标记(