快速业务通道

庖丁解牛Asp.net3.5控件和组件开发技术系列—页面状态机制(四)

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-05-20
文件名称为SessionPageAdapter.browser的文件,内容如下:
<browsers>
   //… …
   <browser refID="Default">
    <controlAdapters>
     <adapter controlType="System.Web.UI.Page" adapterType="KingControls. SessionPageAdapter" />
    </controlAdapters>
   </browser>
</browsers>

运行一下页面,也会发现得到与之前相同的效果。这两种方法都能够在服务器Session中存储视图信息。不同的一点是后面这种方式影响到了整个站点下面的所有页面。

Session一般用于存储特定于单独会话的短期信息,比存储到客户端隐藏域中方式要安全得多。但这种方式要占用服务器内存,因此在客户端比较多的情况下不要在Session中存储大量的信息。

6.9.2 体积优化 -- -- 压缩视图状态数据

这一节讲解另一种优化技术,在序列化对象信息前先压缩数据。其实现机制也是重写基类Page的PageStatePersister属性,下面就介绍一下它的实现。

首先定义一个实现System.Web.UI.PageStatePersister基类的类CompressPageStatePersister,代码如下所示:

/// <summary>
/// 获得本书更多内容,请看:
/// http://blog.csdn.net/ChengKing/archive/2008/08/18/2792440.aspx
/// </summary>
public class CompressPageStatePersister : PageStatePersister
{
   private string PageStateKey = "____VIEWSTATE";
   public CompressPageStatePersister(Page page) : base(page)
   {
   }
   public override void Load()
   {
     string postbackState = Page.Request.Form[PageStateKey];
     if (!string.IsNullOrEmpty(postbackState))
     {
       //页面状态包括视图状态和控件状态两部分
       Pair statePair = (Pair)CompressHelp.Decompress(postbackState);
       if (!Page.EnableViewState)
       {
         this.ViewState = null;
       }
       else
       {
         this.ViewState = statePair.First;
       }
       this.ControlState = statePair.Second;
     }
   }

   public override void Save()
   {
     if (!Page.EnableViewState)
     {
       this.ViewState = null;
     }
     if (this.ViewState != null || this.ControlState != null)
     {
     string stateString;
       Pair statePair = new Pair(ViewState, ControlState);
       stateString = CompressHelp.Compress(statePair);
       Page.ClientScript.RegisterHiddenField(PageStateKey, stateString);
     }
   }
}

在以上代码中重写了PageStatePersister类的的Load和Save两个方法。PageStateKey变量为页面状态保存在页面中的字段名。

在Load方法中,首先通过语句:

string postbackState = Page.Request.Form[PageStateKey];

取得保存到客户端压缩了的状态信息,然后调用压缩类CompressHelp中的Decompress方法解压缩返回,然后赋值给基类中的this.ViewState和this.ControlState,这两个对象分别标志视图状态和控件状态。

Save的过程正好相反,将当前对象的数据压缩,并通过Page.RegisterHiddenField方法把值注册到客户端隐藏控件。

压缩类CompressHelp主要提供了两个静态方法,代码如下:

/// <summary>
/// 获得本书更多内容,请看:
/// http://bl

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号