帝国软件
  设为首页 加入收藏 关于我们
 
解密帝国网站管理系统
栏 目:
 
您的位置:首页 > 技术文档 > ASP.NET编程
前几天看IBuySpy时记在OneNote里面的笔记
作者:kaneboy 发布时间:2005-03-12 来源:ASPCOOL
    
  IBuySpy Portal 中使用 PortalModuleControl 这个继承自UserControl的类来作为站点中所有Module的基类,用户控件的工作方式是,当页面上实例化一个用户控件时,自动将它的所有子控件全部Render成HTML,然后输出,为了提高Module的工作效率,每个Module可以设置自己的缓存时间,在缓存时间内,系统不会再重复Render它的所有子控件,而是在第一次Render的时候,把结果HTML文本缓存起来,当下次需要的时候再直接输出。
  
  
  
  实现缓存功能,IBuySpy是通过CachedPortalModuleControl实现的。
  
  
  
  因为IBuySpy页面上的Module都是通过LoadControl()方法来动态载入到页面上的,像这样:
  
  
  
  PortalModuleControl portalModule = (PortalModuleControl) Page.LoadControl(_moduleSettings.DesktopSrc);
  
  
  
  portalModule.PortalId = portalSettings.PortalId;
  portalModule.ModuleConfiguration = _moduleSettings;
  
  
  
  parent.Controls.Add(portalModule);
  
  
  
  当检测到一个Module的CacheTime>0时,代码则:
  
  
  
  CachedPortalModuleControl portalModule = new CachedPortalModuleControl();
  
  
  
  portalModule.PortalId = portalSettings.PortalId;
  portalModule.ModuleConfiguration = _moduleSettings;
  
  
  
  parent.Controls.Add(portalModule);
  
  
  
  就是说,代码不会再载入PortalModuleControl类型的控件了,而是载入CachedPortalModuleControl来实现的。
  
  
  
  下面看看CachedPortalModuleControl是如何实现缓存的:
  
  
  
  private String _cachedOutput = "";
  
  
  
  这里定义了一个String变量,保存缓存的内容
  
  
  
  protected override void CreateChildControls() {
  
  
  
  if (_moduleConfiguration.CacheTime > 0) {
  
  _cachedOutput = (String) Context.Cache[CacheKey];
  
  }
  
  
  
  CreateChildControls()这个方法是在Control类每次被实例化时,都会执行的方法。首先检查这个Module是否启用了缓存,如果启用了,则从Context.Cache中寻找缓存,并载入到_cachedOutput中。
  
  (CachedPortalModuleControl实质上是一个Composite Control,有关复合控件的相关资料,参阅:
  
  ms-help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.2052/cpguide/html/
  cpcondevelopingcompositecontrols.htm)
  
  
  
  if (_cachedOutput == null) {
  
  
  
  base.CreateChildControls();
  
  
  
  PortalModuleControl module = (PortalModuleControl) Page.LoadControl(_moduleConfiguration.DesktopSrc);
  
  
  
  module.ModuleConfiguration = this.ModuleConfiguration;
  
  module.PortalId = this.PortalId;
  
  
  
  this.Controls.Add(module);
  
  }
  
  
  
  如果_cachedOutput为null,那么说明还没有缓存,于是调用base.CreateChildControls(),然后用LoadControl()方法重新(真实的)载入控件,并把这个控件放入本控件的子控件树中。
  
  
  
  protected override void Render(HtmlTextWriter output) {
  
  
  
  if (_moduleConfiguration.CacheTime == 0) {
  
  base.Render(output);
  
  return;
  
  }
  
  
  
  现在到了Render方法,这个方法用于输出控件的HTML,首先检查是否启用缓存,如果没有,直接调用base.Render()直接输出,然后return。
  
  
  
  if (_cachedOutput == null) {
  
  
  
  TextWriter tempWriter = new StringWriter();
  
  base.Render(new HtmlTextWriter(tempWriter));
  
  _cachedOutput = tempWriter.ToString();
  
  
  
  Context.Cache.Insert(CacheKey, _cachedOutput, null, DateTime.Now.AddSeconds(_moduleConfiguration.CacheTime), TimeSpan.Zero);
  
  }
  
  
  
  如果启用了缓存,但是用来保存缓存内容的变量为null,那么就调用base.Render()方法,把所有应该输出的HTML输出到_cachedOutput变量中,然后把这个变量的内容放入Context.Cache中。
  
  
  
  output.Write(_cachedOutput);
  
  
  
  最后,把这个变量中的HTML内容输出。
  
  作者:kaneboy Blog:http://blog.joycode.com/kaneboy/
  

  
评论】【加入收藏夹】【 】【打印】【关闭
※ 相关链接
无相关信息

   栏目导行
  PHP编程
  ASP编程
  ASP.NET编程
  JAVA编程
   站点最新
·致合作伙伴的欢迎信
·媒体报道
·帝国软件合作伙伴计划协议
·DiscuzX2.5会员整合通行证发布
·帝国CMS 7.0版本功能建议收集
·帝国网站管理系统2012年授权购买说
·PHPWind8.7会员整合通行证发布
·[官方插件]帝国CMS-访问统计插件
·[官方插件]帝国CMS-sitemap插件
·[官方插件]帝国CMS内容页评论AJAX分
   类别最新
·ASP.NET中为DataGrid添加合计字段
·.text urlRewrite介绍
·利用 ASP.NET 的内置功能抵御 Web
·ASP.NET Cache
·用 WebClient.UploadData 方法 上载
·ASP.NET 程序设计-序
·什么是客户端/伺服端(Client/Serve
·因特网应用程序的开发
·网页的种类
·.NET Framework-Microsoft Visual
 
关于帝国 | 广告服务 | 联系我们 | 程序开发 | 网站地图 | 留言板 帝国网站管理系统