ViewState的处理

2007.8.18和19号,我再次游玩了大明山,一样的山,一样的水,还是那样的尽兴;唯独更换了伙伴。远离水泥森林,漫步在山道上,是那样的悠闲、愉悦。晚上回到家,我居然很有兴致的看起ASP.NET2.0书来,看了一章关于介绍ViewState,对ViewState也有了新的理解。
        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 OnionViewState解码器ViewState Decoder (2.2)。具体的使用方法,自己下载下来使用,比较简单。ViewState很容易进行解码,因此敏感的信息最好不要保存在ViewState中。
       
在实际的项目中,我经常看到ViewState的长度有几个屏幕的看不完的情况。如果遇到防火墙对POST请求值有最大尺寸限制的情况下,问题就会出现,常常会被防火墙拒绝。
       
这个时候,就需要我们采用合理的方法来处理ViewState,通常我们建议ViewState的大小不超过总页面的30%
1、分解ViewState
ASP.NET2.0
开始在Page类中有MaxPageStateFieldLength属性,以字节为单位。这样的话,如果ViewState的长度超过最大长度,就会自动分解成多个块。ASP.NET1.1中还没有这个功能,实现起来也没有这么方便,需要重写LoadPageStateFromPersistenceMediumSavePageStateToPersistenceMedium方法来实现。

2、压缩ViewState
我们可以从icsharpcode.net上下载开源的SharpZipLib库,来实现ViewState的压缩和解压缩。

3、把ViewState放到其他位置存储
ViewState超过20k,或者更大的时候。我们可以考虑把ViewState存储到Session中,每个页面有自己的GUID,这个GUID声明作为value值,根据GUID来设置和读取ViewState的值。也可以通过重写LoadPageStateFromPersistenceMediumSavePageStateToPersistenceMedium方法来实现。

4、把ViewState移到页面底部
通过重写页面的Render方法来实现。

以上是处理ViewState的一些方法,写起来太累,至于具体实现方法的代码,可以网上搜索一下,欢迎大家提出更好的意见。

posted on 2007-08-20 16:19  Yolion  阅读(1201)  评论(4编辑  收藏  举报