快速业务通道

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

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-05-20
}
   }
   //… …
}

先讲解一下SaveViewState方法中的代码逻辑。首先定义一个Pair对象p,成员p.First负责存储基类中序列化后的对象(其中就包括ViewState属性对象);至于成员p.Second,笔者用它来存储SolidCoordinate属性,主要通过这两句完成序列化功能:

SolidCoordinateConverter convert = new SolidCoordinateConverter();

p.Second=convert.ConvertTo(null,null,this.SolidCoordinate,typeof(string));

第一条语句定义SolidCoordinate类的转换器对象,第二条语句使用转换器对象的ConvertTo方法把SolidCoordinate类型的属性转换为字符串,存储到p.Second属性中。最后返回p作为整个控件的对象序列化结果。

而LoadViewState逻辑正好相反,主要功能是把视图信息对象再赋值给控件属性(包括基类的属性)。不同的是这次调用的是ConvertFrom方法。

增加这两个方法后,主控件已经使SolidCoordinate属性具有了视图状态保存能力。再在浏览器中运行页面验证一下,单击"提交"按钮后输出的结果如图6-8所示。

图6-8 SolidCoordinate属性值成功保存到ViewState中

另外,如果在自定义类内部关联了类型转换器,则还可以把这句:

SolidCoordinateConverter convert = new SolidCoordinateConverter();

修改成如下写法:

TypeConverter convert = TypeDescriptor.GetConverter(this.SolidCoordinate);

这两句功能相同,不同的是后者使用TypeDescriptor的GetConverter静态方法返回指定类的关联转换器。

这一节内容就讲这么多。本节以SolidCoordinate类为典型例子,说明了类型转换器在视图状态中的用法。使用这种方式,为自己的控件属性的增加视图状态时,就比较容易了。噢,忘了一点,还要记住我们是为了提高序列化速度而采用的这种方法。

6.9 页面状态性能优化策略

6.9.1 存储位置优化 -- -- 把视图状态信息保存在服务端而非客户端

视图状态信息默认情况下是存储在客户端的,不占用服务端资源(这里是指持续地占用服务器资源一定时间,视图状态只是在页面呈现时,服务端正反向解析视图状态内容占用一会服务器内存,当页面呈现完成后则会把视图存储到页面上的隐藏控件域中)。当页面结构比较复杂时,会导致视图信息字节数比较大,则会产生带宽瓶颈。为了解决这个问题我们可以选择把视图信息存储到服务器端,或数据库中,或文件等存储介质。这一节我们就以把视图状态存储到服务端Session中为例,说明其实现方法。

新建一个页面SessionPageStatePersister.aspx,页面中的内容仍然使用前面的控件状态控件的测试页面内容,设置好页面内容后,在后台代码中重写基类Page的PageStatePersister属性,如下所示:

/// <summary>
/// 获得本书更多内容,请看:
/// http://blog.csdn.net/ChengKing/archive/2008/08/18/2792440.aspx
/// </summary>
public partial class Page_SessionPageStatePersister : System.Web.UI.Page
{
   protected override PageStatePersister PageStatePersister
   {
     get
     {
       return new SessionPageStatePersister(this);
     }
   }
}
为了更容易理解,下面是Page对该属性的系统默认实现源代码:
protected virtual PageStatePersister PageStatePersister
{
   get
   {
     if (this._persister == null)
     {
       PageAdapter pageAdapter = this.PageAdapter;
       if (pageAdapter != null)
       {
         this._persister = pageAdapter.GetStatePersister();
       }
       if (this._persister == null)
       {

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站: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号