asp.net中ViewState的用法详解
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
中ViewState的⽤法详解
在web窗体控件设置为runat = "server",这个控件会被附加⼀个隐藏的属性_ViewState,_ViewState存放了所有控件在ViewState中的状态值。
ViewState是⼀个名称/值的对象集合。
当请求某个页⾯时,会把所有控件的状态序列化成⼀个字符串,然后作为窗体的隐藏属性送到客户端,当客户端吧页⾯回传时,分析回传的窗体属性,并赋给控件对应的值。
当我们在写⼀个表单时, ⼀旦标明了 form runat=server ,那么,就会⾃动在输出时给页⾯添加⼀个隐藏域
<input type="hidden" name="__VIEWSTATE" value="">
那么,有了这个隐藏域,页⾯⾥其他所有的控件的状态,包括页⾯本⾝的⼀些状态都会保存到这个控件值⾥⾯. 每次页⾯提交时⼀起提交到后台,对其中的值进⾏解码,然后输出时再根据这个值来恢复各个控件的状态. 我们再看这个控件的value值,它可能类似如下的形式:Oz4+O2w8aTwxPjs+O2w8.... 很多⼈会认为这是加密的信息,其实不是, ms仅仅是给各个控件和页⾯的状态存⼊适当的对象⾥⾯,然后把该对象序列化, 最后再做⼀次base64编码,直接赋值给viewstate控件.
⼀、ViewState的原理
1.浏览器请求Default.aspx页⾯
2.在服务器端发现创建的ViewState 这个时候会⾃动创建⼀个名字叫做__VIEWSTATE(双下滑线全部是⼤写)的隐藏域其隐藏域的值经过base64加密以后返回到浏览器端这⼀加密过程在页⾯⽣命周期的SaveState事件中的SaveAllState⽅法中完成
3.当浏览器提交表单的时候将__VIEWSTATE的隐藏域也⼀起提交到服务端这个时候页⾯⽣命周期的ReadState事件的ReadAllState⽅法会将加密后的值反base64解密最后将值赋值给名字叫做name的ViewState
4.最后来操作ViewState中的值
⼆、ViewState的⽤法:
1.定义ViewState属性
public int PageCount{
get{return (int)ViewState["PageCount"];}
set{ViewState["PageCount"]=value;}
}
2.使⽤ViewState的条件
如果要使⽤ViewState,则在ASPX页⾯中必须要有⼀个服务器端窗体标记(<form runat = "server">)。
窗体字段是必须的,这样包含ViewState信息的隐藏字段才能被传回服务器。
⽽且,该窗体还必须是服务器端的窗体,这样在服务器上执⾏该页⾯时,页⾯框架才能添加隐藏字段。
page的EnableViewState 属性值为true
控件的EnableViewState 属性值为 true
3.ViewState需要注意的地⽅
a. 当存在页⾯回传时,不需要维持控件的值就要把 ViewState 禁⽌。
b. ViewState的索引是⼤⼩写敏感的。
c. ViewState不是跨页⾯的。
d. 为了能保存在 ViewState中,对象必须是可流化或者定义了 TypeConverter。
e. 控件 TextBox 的 TextMode 属性设置为 Password时,它的状态将不会被保存在 ViewState 中,这应该是出于安全性的考虑。
f. 在页⾯没有回传或重定向或在回传中转到(transfer)其他页⾯时不要使⽤ ViewState。
g. 在动态建⽴控件时要⼩⼼它的 ViewState。
h. 当禁⽌⼀个程序的 ViewState 时,这个程序的所有页⾯的 ViewState 也被禁⽌了。
i. 只有当页⾯回传⾃⾝时ViewState 才是持续的。
4.设置ViewState
ViewState可以在控件,页,程序,全局配置中设置。
缺省情况下 EnableViewState 为 true 。
如果要禁⽌所有页⾯ ViewState 功能,可以在程序配置中把 EnableViewState 设为 false 。
三、产⽣的 __VIEWSTATE如图
使⽤ViewStateDecoder2(ViewState查看器)来看⼀下值
所以ViewState在安全性上⾯还是⽐较差,建议不要存放⽐较机密和敏感的信息,尽管ViewState可以加密,但是由于ViewState要保存在客户端,天⽣就有安全性的隐患。
四、viewstate与session的对⽐
(1) session值是保存在服务器内存上,那么,可以肯定,⼤量的使⽤session将导致服务器负担加重. ⽽viewstate由于只是将数据存⼊到页⾯隐藏控件⾥,不再占⽤服务器资源,因此, 我们可以将⼀些需要服务器"记住"的变量和对象保存到viewstate⾥⾯. ⽽sesson则只应该应⽤在需要跨页⾯且与每个访问⽤户相关的变量和对象存储上.
(2) session在默认情况下20分钟就过期,⽽viewstate则永远不会过期.
但viewstate并不是能存储所有的.net类型数据,它仅仅⽀持String、Integer、Boolean、Array、ArrayList、Hashtable 以及⾃定义的⼀些类型.
任何事物都有两⾯性, 使⽤viewstate会增加页⾯html的输出量,占⽤更都的带宽,这⼀点是需要我们慎重考虑的. 另外, 由于所有的viewstate都是存储在⼀个隐藏域⾥⾯,⽤户可以很容易的通过查看源码来看到这个经过base64编码的值.然后再经过转换就可以获取你存储其中的对象和变量值。