ViewState的出现,使我们开发程序变得更加方便、快捷,但是它也使我们的程序变得臃肿。ViewState可以很方便的帮我们存储控件的状态和值(ASP.NET2.0有ControlState,专门来保存控件的状态),当页面以Html方式展现在我们面前的时候,ViewState是以一个隐藏控件的方式写在Html中,如:
<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方法来实现。
2、压缩ViewState
我们可以从icsharpcode.net上下载开源的SharpZipLib库,来实现ViewState的压缩和解压缩。
3、把ViewState放到其他位置存储
当ViewState超过20k,或者更大的时候。我们可以考虑把ViewState存储到Session中,每个页面有自己的GUID,这个GUID声明作为value值,根据GUID来设置和读取ViewState的值。也可以通过重写LoadPageStateFromPersistenceMedium和SavePageStateToPersistenceMedium方法来实现。
4、把ViewState移到页面底部
通过重写页面的Render方法来实现。
以上是处理ViewState的一些方法,写起来太累,至于具体实现方法的代码,可以网上搜索一下,欢迎大家提出更好的意见。