1、Session 是保存在服务器内存上的,大量的session,会造成服务器负担加重;ViewState是将数据存入页面隐藏控件中,不占用服务器资源。
2、所以,我们可以将需要服务器“记住”的变量和对象保存到ViewState里面。而Session则只应该用在需要跨页面且与每个访问用户相关的变量和对象存储上。
3、Session在默认情况下20分钟就过期,而ViewState则永远不会过期。
4、ViewState并不能存储所有的.net类型数据,它仅仅支持String、Integer、Boolean、Array、ArrayList 、Hashtable以及自定义的一些类型。
ViewState会增加Html的输出量,占用更多的带宽。对于VIewState的安全性问题,有两种方式:一、防篡改,二、加密。
防篡改,使用散列代码,在页面顶部加入如下代码:Page EnableViewStateMAC = true.这样asp.net就会自动的在ViewState中追加一个散列码,在页面回传时,服务器根据回传的viewstate生成一个散列码,再与回传的散列码相比较,如果不对,则丢弃该ViewState,同时控件将恢复初试状态(默认情况下asp.net是通过SHA1算法而不是MD5算法来生成散列,不过这个可以在machine.config里面配置machineKey validation="MD5"即可)。
加密,只要在machine.config里设置下machineKey validation = "3DES" 即可实现用des加密viewstate了。
ASP.net ViewState用法
ASP.Net中的ViewState是ASP.Net中用于保存WEB控件回传时状态值的一种机制,在WEB窗体(FORM)的设置为runat="server",这个窗体(FORM)会被附加一个隐藏的属性_VIEWSTATE._VIEWSTATE中存放了所有控件在ViewState中的状态值。
定义ViewState属性
Public int PageCount
{
get{return(int)ViewState["PageCount"];}
set{ViewState["PageCount"]=value;}
}
使用ViewState的条件
如果要使用ViewState,则在ASPX页面中必须有一个服务器端窗体标记(<form runat=server>).窗体字段是必需的,这样包含ViewState信息的隐藏字段才能回传给服务器。而且,该窗体还必需是服务器端的窗体,这样在服务器上执行该页面时,ASP.NET 页面框架才能添加隐藏的字段。
Page的EnableViewState属性值为true。
控件的EnableViewState属性值为true。
注意:
1、当存在页面回传时,不需要维持控件的值就要把ViewState禁止。
2、ViewState的索引是大小写敏感的。
3、ViewState不是跨页面的。
4、为了能保存在ViewState中,对象必须是可流化或者定义了TypeConverter.
5、控件TextBox的TextMode属性设置为Password时,它的状态将不会被保存在ViewState中。
6、在页面没有回传或重定向或在回传到其他页面时不要使用ViewState。
7、在动态建立控件时要小心它的ViewState。
8、当禁止一个程序的ViewState时,这个程序的所有页面的ViewState也被禁止了。
9、只有当页面回传自身时ViewState才是持续的。