ViewState优化

ViewState是个好东西,使得开发者在开发web项目的时候感觉不到Http的无状态性。

不过,随着页面复杂,页面上控件多了以后,viewstate会变得很庞大。

特别是在IE里,对于复杂页面,往往postback一下会白屏一下,用户体验非常不好。可能你会说用ajax就可以了,是的,不过这是另外的话题了。这里讨论的是如何用最少的改动来改善viewstate。

其中有一种方法是把ViewState存在服务端的数据库,Render到客户端的是一个Guid,ViewState的数据存在数据库某张表,这样客户端就看不到ViewState了,安全性和传输内容的大小都非常好,但是每次LoadViewState的时候会去查询一次数据库,开销显然太大,而且数据库的脏数据会很多,以为不知道何时去清除ViewState。

另一种方法就是我在这里想讨论的: 

我们知道,asp.net render到客户端的html中,viewstate是记在一个hidden的html element里的,而这个element的位置确实在Form刚开始。所以对于ie来说,先会去处理这个hidden的element,如何 viewstate过大,处理时间长了,那页面就白了。对于firefox和chrome,好像不存在这样的情况。

所以我的想法是,将这个viewstate的hidden放到页面的最后,让ie先处理前面的html,把前面的html先显示出来。当然这里要注意的是,不要用table来布局页面,因为对于ie,如果整个页面被一个table包含的话,ie会直到整个table都被载入完毕以后才会显示该table,所以请尽量用div布局。

然后,我们开始动手:

新建PageBase页面,继承System.Web.UI.Page。

 1 /// 
 2         /// add a hidden control at the bottom of the form.
 3         /// 
 4         protected override void CreateChildControls()
 5         {
 6             base.CreateChildControls ();
 7 
 8             foreach( Control c in this.Controls )
 9             {
10                 if( c.GetType() == typeof( HtmlForm ) )
11                 {
12                     HtmlInputHidden hiViewState = this.FindControl( "____VIEWSTATE" ) as HtmlInputHidden;
13                     if( hiViewState == null )
14                     {
15                         hiViewState = new HtmlInputHidden();
16                         hiViewState.ID = "____VIEWSTATE";
17                         hiViewState.Name = "____VIEWSTATE";
18                         c.Controls.Add( hiViewState );
19                     }
20                     
posted @ 2009-11-19 18:31  '.Elvis.'  阅读(325)  评论(0编辑  收藏  举报