程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> ASP.NET >> 關於ASP.NET >> BlogEngine.Net架構與源代碼分析系列part12:頁面共同的基類

BlogEngine.Net架構與源代碼分析系列part12:頁面共同的基類

編輯:關於ASP.NET

BlogBasePage

上一篇文章我向大家展示了BlogEngine.Net中Theme的原理和一些開發規范,裡面有很多內容和這篇文章有著聯系,建議大家這兩篇文章結合在一起看,這樣效果會更好。在這篇文章中我主要向大家說明BlogBasePage,PostViewBase,CommentViewBase這三個類的內部實現上的一些技巧以及它們與頁面,文章和評論之間是如何組織在一起的,希望對大家閱讀這部分代碼有幫助。

認識一下它們

BlogBasePage,PostViewBase,CommentViewBase它們都是一些元素的基類,首先把這些元素定義成基類,然後使用繼承的方式實現我認為主要有以下好處:

1.代碼復用會得到提升,對於一些大量的同樣操作都可以放在基類中,子類直接可以繼承使用。

2.職責清晰,例如在Theme中的CommentView.ascx直接繼承CommentViewBase就行了,CommentView.ascx只是來處理將Comment如何展現的問題。

3.規范化,這是繼承帶來的一個很重要的好處,因為子類就是一個父類,只要它是就可以使用。

BlogBasePage:Web站點的根目錄下的每一個頁面都是從它繼承而來,BlogBasePage繼承自Page。而頁面不是直接從Page繼承而來。

PostViewBase:是一個Post顯示功能部分的基類,themes中每個主題的PostView.ascx都是直接從它繼承而來,PostViewBase繼承自UserControl。

CommentViewBase:是一個Comment顯示功能部分的基類,themes中每個主題的CommentView.ascx都是直接從它繼承而來,CommentViewBase繼承自UserControl。

實現分析

BlogBasePage到底都做了些什麼?

OnPreInit中主要完成根據BlogSetting中的Theme找到相應的頁面的Master文件(包括主題選擇時的預覽判斷),此外還處理了Post的刪除。

OnLoad中做得事情很多,主要是在head中加入一些資源引用(包括SIOC,APML,FOAF等),實際上就是當我們打開頁面查看源代碼看到head中多如牛毛的link。還有增加一些腳本的全局變量,增加BlogSetting中的自定義Head的html,增加track腳本,增加腳本引用(通過JavaScriptHandler來實現),增加樣式(注意css的壓縮是通過CssHandler實現的)。

OnPreRenderComplete中完成了標題的設置。

OnError中還對使用Comment的惡意攻擊做了處理。

protected override void OnError(EventArgs e)
{
HttpContext ctx = HttpContext.Current;
Exception exception = ctx.Server.GetLastError();
if (exception != null && exception.Message.Contains("callback"))
{
// This is a robot spam attack so we send it a 404 status to make it go away.
ctx.Response.StatusCode = 404;
ctx.Server.ClearError();
Comment.OnSpamAttack();
}
base.OnError(e);
}

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved