Welcome 微信登录

首页 / 网页编程 / ASP.NET / BlogEngine.Net架构与源代码分析系列part12:页面共同的基类

BlogEngine.Net架构与源代码分析系列part12:页面共同的基类2012-02-01 cnblogs GUO XingwangBlogBasePage

上一篇文章我向大家展示了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);
}