不是哦!viewstate是隐藏域 的一部分,请看下面资料
隐藏域---ViewState---ControlState----->保存数据的另一个场所
1.使用隐藏域
除了Session、Application和Cache可以保存数据外,那还有哪里可以让我们暂时保存数据呢?那就是页面!我们可以设置一个控件隐藏,那我们就可 以用这个控件来保存一些临时数据,供当前页面的程序使用
同时,我们还可以使用隐藏域来进行类似的工作,但在隐藏域中填写的内容不会直接显示在IDE的设计视图中,代码如下:
<asp:HiddenField ID="HiddenField1" runat="server" Value="编程快乐"/>
在代码中可以直接访问隐藏域的Value属性获得其值:
Response.Write(HiddenField1.Value);
不过,这样做有几个不合理的地方:
数据直接暴露给用户、只能存储字符串数据
2.使用ViewState(视图状态)
ViewState主要是用来存放和视图有关的一些状态,ASP.NET通过ViewState自动保存控件的状态,同时,我们也可以利用ViewState来保存一些程序需 要的数据,ViewState中的数据默认是使用base64进行编码的,因此,用户不能直接看到里面的数据
在代码中添加一个ViewState项: ViewState["test"]="编程快乐";
查看源代码:<input type="hidden" name="_VIEWSTATE" id="_VIEWSTATE" value="xt+q3cdaffdsaefcsaesefdserfs">
既然ViewState是存在页面上,那么ViewState则不能跨页使用,每个用户访问到得ViewState都是独立的,另外,页面在ViewState就在,页面关闭 ViewState就关闭
3.ViewState的安全与性能
保证安全性:保证客户端提交过来的ViewState没有被修改、保证用户不能直接看到ViewState中的数据(加密)
对ViewState进行验证和加密:
<%@ Page Language="C#" EnableViewStateMac="true" ViewStateEncryptionMode="Always"%>
如果要对所有页面进行ViewState的验证和加密,可以在Web.config的system.Web节点中添加:
<pages enableViewStateMac="true" ViewStateEncryptionMode="Always"></pages>
既然ViewState中的数据时序列化后加入的,那么我们就可以把一些复杂的类型(比如类)存放到ViewState中,比如:
MyUser user=new MyUser("小猪",20);
ViewState["CustomClass"]=user;
读取代码:
MyUser user=ViewState["CustomClass"] as MyUser;
ViewState中尽量保存少量的数据,如果实在需要在ViewState中放置大量的数据建议使用maxPagesStateFieldLength对ViewState启用分块传输:
<%@ Page Language="C#" maxPageStateFieldLength="100"%>
ASP.NET会把控件交互相关的一些数据都存放到ViewState中,但是对于一些不识闲任何交互的控件,可以设置控件的EnableViesState属性为false来 让控件不适用ViewState,从而减少页面体积
4.ControlState
用于保存(自定义)控件的关键信息
就算页面或者控件的ViewState被关闭它还能起作用,弥补了ViewState能被禁止的不足
但是使用ControlState稍显复杂,我们需要自己序列化复杂对象进行存储
在ControlState中保存和读取简单字符串的代码:
PageStatePersister.ControlState="编程快乐";
Response.Write(PageStatePersister.ControlState.ToString());
5.对隐藏域、ViewState和ControlState的总结
存储的物理位置:表单隐藏域
存储的类型限制:可序列化类型(直接在隐藏域中保存内容需要自己序列化)
状态使用的范围:当前页面(当前控件),对用户独立
存储的大小限制:存储过大数据会导致页面不能正常打开,不能正常提交
生命周期:页面在就在,页面不在就不在了,三者始终是衣服在页面的隐藏域中
安全与性能:在客户端存储,安全性低,不过,ViewState提供了验证和加密
优缺点与注意事项: 存储少量数据非常方便简单,但需要注意不要存储敏感数据,不要存储过大数据,隐藏域、ViewState和ControlState始终参与 往返,而且序列化和反序列化会消耗一定资源,因此,存储过大的数据会导致网页加载过慢,浪费服务器带宽
|