基本理论:
session值是保存在服务器内存上,如果大量使用session将导致服务器负担加重,而viewstate只是将数据存入到页面隐藏控件里,不再占用服务器资源,所以,可以将一些需要服务器记住的变量和对面保存到viewstate里面,而session则只应该应用在需要跨页面且与每个访问用户相关的变量和对象存储上,且,session在默认情况下20分钟就过期,而viewstate则永久不会过期。
支持数据类型:
string,integer,boolean,Array,ArrayList,Hashtable,以及自定义的一些类型。
安全性:
保护viewstate有两种方式:
1.防篡改----即使用散列代码,在页面顶部加入代码:Page EnableViewStateMAC=true.这样asp.net机会自动在viewstate中追加一个散列码,在页面回传时,服务区根据回传的viewstate生成一个散列码,再与回传的散列码相比较,如果不对,啧丢弃该viewstate,同时控件将回复初试状态。(默认情况下asp.net是通过SHA1算法而不是md5算法来生成散列,不过这个可以在machine.config里面配置,即 machineKey validation=“MD5”)
2.加密---在machine.config里设置 machineKey validation=“3DES”实现用des加密viewstate
应用环境:
1.与安全性无关,数据量较小,需长时间操作的参数,用viewstate存取。
2.在webgis中,地图的各种相关状态,如zoom,center,layers,visibility等,用viewstate存取的话,就不存在session过期的问题,网页可以永久使用,甚至可以下载保存,在进行地图请求,或者iframe到第三方的应用中。
注意事项:
1.使用viewstate,在aspx页面中必须有一个服务器端船体标记 eg:runat=“server”,窗体字段是必须的,窗体必须是服务器端的窗体。
2.Page的EnableViewState属性值为true
控件的EnableViewState属性值为true。
3.当存在页面回传时,不需要维持控件的值就要把viewstate禁止。
4.viewstate的索引是大小写敏感的。
5.viewstate不是跨页面的。
6.为了能保存在viewstate中,对面必须是可流化或者定义了TypeConverter。
7.控件TextBox的TextMode属性设置为password时,他的状态将不会被保存在viewstate中,这是出于安全考虑。
8.当禁止一个程序的viewstate时,这个程序的所有页面的viewstate也被禁止。
9.只有当页面回传自身时,viewstate才是持续的。
10.viewstate可以在控件,页,程序,全局配置中设置,默认EnableViewState为true,禁用viewstate功能设为false。
应用:
viewstate是asp.net中用来保存web控件回传时状态值一种机制,在web窗体form的设置为runat“server”,这个窗体form会被附加一个隐藏的属性_VIEWSTATE. _VIEWSTATE中存放了所有控件在viewstate中的状态值。
viewstate是类control中的一个域,其他所有控件通过继承control来获得viewstate功能,它的类型是system.web.UI.StateBag,一个名称/值的对象集合。
当请求某个页面时,asp.net把所有控件的状态序列化成一个字符串,然后作为船体的隐藏属性送到客户端,当客户端把页面回传时,asp.ent分析回传的窗体属性,并赋给控件对应的值。