国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > 綜合 > 正文

前幾天看IBuySpy時記在OneNote里面的筆記

2024-07-21 02:15:47
字體:
來源:轉載
供稿:網友

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內容輸出。 
  
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 临汾市| 隆子县| 横峰县| 隆回县| 贺州市| 阿瓦提县| 武定县| 泰顺县| 汝南县| 永兴县| 肥城市| 林西县| 永川市| 柳州市| 姜堰市| 永丰县| 达拉特旗| 红原县| 长寿区| 左权县| 广元市| 罗甸县| 房产| 五河县| 泸溪县| 嘉禾县| 大足县| 高安市| 嘉荫县| 大姚县| 宣恩县| 托克逊县| 子长县| 平昌县| 临安市| 福海县| 铁力市| 赤城县| 肥乡县| 石楼县| 黎城县|