ViewState是ASP.NET中用来保存web控件回传时的状态值的一种机制。在web窗体(Form)的设置为runat="server",这个窗体会被附加一个隐藏的属性_VIEWSTATE。_VIEWSTATE中存放了所有控件在ViewState中的状态值。ViewState是类Control中的一个域,其他所有控件通过继承Control来获得ViewState功能。它的类型是System.Web.UI.StateBag,一个名称/值的对象集合。当请求某个页面时,ASP.NET把所有控件的状态序列化成一个字符串,然后作为窗体的隐藏属性送到客户端。当客户端把页面回传时,ASP.NET分析回传的窗体属性,并赋给控件对应的值。当然这些全部都是由ASP.NET负责,对用户来说是透明的。
如果要使用ViewState,则在aspx页面中必须有一个服务器端窗体标志(form runat="server")。窗体字段是必需的,这样包含ViewState信息的隐藏字段才能回传给服务器。而且,该窗体还必须是服务器端的窗体,这样在服务器上执行该页面时,ASP.NET页面框架才能添加隐藏的字段。Page的EnableViewState属性值为true。控件的EnableViewState属性值为true。页面本身将20字节左右的信息保存在ViewState中,用于在回传时将postBack数据和ViewState值分发给正确的控件。因此,即使该项页面或应用程序禁用了ViewSTate,仍可以在ViewState中看到少量的剩余字节。
ViewState可以在控件、页面、程序及全局配置文件中设置。默认情况下EnableViewState为true。如果要禁止所有页面ViewState功能,可以程序配置中把EnableVewState设为false。在控件中,可以通过设置控件的enableViewState的属性来设置ViewState。在页面中可以通过<%PageEnableViewState="false"%>或Page.EnableViewState=false配置ViewState。
在全局配置中可以在配置文件中修改<pages enbleViewState="false"/>。
ViewState存放位置的优先级别:全局配置<程序<页<控件。
对ViewState需要注意以下一些规则:
1、当存在页面回传时,不需要维持控件的值就要把ViewState禁止。
2、ViewState的索引是大小写第三的,而且ViewState 不是跨页面的。
3、为了能保存在ViewState中,对象必须是可以序列化的或者定义了typeConverter。
4、控件TextBox的TextMode属性设置为Password时,它的状态将不会被保存在ViewState中,这应该是出于安全性的考虑。
5、在页面没有回传、重定向,或在回传中转到(transfer)其它页时,不要使用ViewState。
6、在动态建立控件时要小心它的ViewState。
7、当禁止一个程序的ViewState时,这个程序的所有页面的ViewState也会被禁止。只有当页面回传自身时ViewState才是持续的。
并不是所有控件都可以设置ViewState为False的,TextBox,Checkbox,CheckboxList,RadioButtonList控件的状态通过IPostBaskEventHandler和IPostBackDataHandler接口处理,而不是ViewState的机制,所以设置EnableViewState没有效果。