<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwUJMjgzMDgzOTgzZGRqBJ2DrJA0WVW8LiR3445iRDt1sg==" />
value保存了控件状态和值,采用Base64编码方式保存,大家可以从http://www.pluralsight.com/tools.aspx上下载Fritz Onion的ViewState解码器ViewState Decoder (2.2)。具体的使用方法,自己下载下来使用,比较简单。ViewState很容易进行解码,因此敏感的信息最好不要保存在ViewState中。
在实际的项目中,我经常看到ViewState的长度有几个屏幕的看不完的情况。如果遇到防火墙对POST请求值有最大尺寸限制的情况下,问题就会出现,常常会被防火墙拒绝。
这个时候,就需要我们采用合理的方法来处理ViewState,通常我们建议ViewState的大小不超过总页面的30%。
1、分解ViewState
ASP.NET2.0开始在Page类中有MaxPageStateFieldLength属性,以字节为单位。这样的话,如果ViewState的长度超过最大长度,就会自动分解成多个块。ASP.NET1.1中还没有这个功能,实现起来也没有这么方便,需要重写LoadPageStateFromPersistenceMedium和SavePageStateToPersistenceMedium方法来实现。
ASP.NET的Page类包含两个可以重写的方法LoadPageStateFromPersistenceMedium 和SavePageStateToPersistenceMedium。在这些方法中,可以确定要对页面的ViewState进行什么处理。
SavePageStateToPersistenceMedium方法把ViewState对象作为输入,并可以用任意方式存储它LoadPageStateFromPersistenceMedium方法必须从存储位置加载以前的ViewState
2、压缩ViewState
我们可以从icsharpcode.net上下载开源的SharpZipLib库,来实现ViewState的压缩和解压缩。
3、把ViewState放到其他位置存储
当ViewState超过20k,或者更大的时候。我们可以考虑把ViewState存储到Session中,每个页面有自己的GUID,这个GUID声明作为value值,根据GUID来设置和读取ViewState的值。也可以通过重写LoadPageStateFromPersistenceMedium和SavePageStateToPersistenceMedium方法来实现。
4、把ViewState移到页面底部
通过重写页面的Render方法来实现。