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);
}