您的位置:首页 > 运维架构 > 网站架构

BlogEngine.Net架构与源代码分析系列part14:实现分析(下)——网站页面上值得参考的部分

2008-11-14 13:33 906 查看
BlogEngine.Net的成功不仅在于它的架构设计,它的代码实现细节也都是很经典的,每个结构分割的很清晰很自然,希望大家多多品位一下。在这篇文章里我将给大家介绍一下BlogEngine.Net的Web实现上的几个亮点,包括Web.config,Ajax的运用等。

Web.config中的几个结点说明

让我们看一下appSettings结点中的各个选项的含义,以便您对整个BlogEngine.Net的认识更加清晰。

BlogEngine.FileExtension:在这里我们可以自定义Url请求的后缀名称,默认是.aspx。您可以定义自己喜欢的扩展名,例如.extguo,那么对于文章等生成的Url就成了类似http://HostName/CategoryName/PostTitle.extguo的形式。这个结点的使用在很多地方都可以见到,例如:

public string RelativeLink

2public static string RelativeWebRoot

2private static readonly Regex MOBILE_REGEX = new Regex(ConfigurationManager.AppSettings.Get("BlogEngine.MobileDevices"), RegexOptions.IgnoreCase | RegexOptions.Compiled);

2

3public static bool IsMobile

8/// <summary>

2/// Creates a client callback back to the requesting page

3/// and calls the callback method with the response as parameter.

4/// </summary>

5function CreateCallback(url, callback)

6

22/// <summary>

23/// Creates a XmlHttpRequest object.

24/// </summary>

25function GetHttpObject()

26// Shows the preview of the comment

2function ToggleCommentMenu(element)

3

22function EndShowPreview(arg, context)

23

27function AddComment(preview)

28
请注意isPreview的引入与它的逻辑,这个Preview实际上也是需要回调到服务器端的程序的,之后生成预览的Render,当点击Save时isPreview为false,这时回调服务器端的代码时才真正的保存,然后浏览器回调客户端的AppendComment完成一些初始化工作。CommentView是一个UserControl并实现了ICallbackEventHandler接口,这个接口有两个方法GetCallbackResult和RaiseCallbackEvent,在RaiseCallbackEvent中我们可以看出,提交的评论参数使用"-|-"作为分隔符,经过一系列处理最后将这个新评论的呈现给了_Callback,_Callback由GetCallbackResult返回。浏览端使用WebForm_DoCallback('ctl00$cphBody$CommentView1',argument, callback,'comment',null,false);在这部分里我们只要实现ICallbackEventHandler接口就行了,实现的细节都已经有.Net提供了,感兴趣细节的朋友可以查一查Asp.Net的回调方面的资料。

Widget排序的实现

当我们用鼠标拖住一个Widget移动到某个位置再放开鼠标时,发现这个Widget在WidgetZone中的排序被永久存储了,甚至在你清空cookie时依然生效,BlogEngine.Net是在服务器端进行的存储,DataStore的be_WIDGET_ZONE中的Widget的顺序就是在页面上Widget的显示顺序。这实际上是通过间接调用WidgetEditor.aspx中的MoveWidgets方法实现的(前文提及过)。那么在浏览器端是如何处理这些排序问题的呢?

在widget.js中的大部分代码都是用来处理拖放排序的,initdragableElements主要完成使某个Widget可以被拖动的初始化工作,widget.js的最后一句代码addLoadEvent(initdragableElements)使其在页面加载时执行。注意initdragableElements中:

document.body.onmousemove = moveDragableElement;

2document.body.onmouseup = stop_dragDropElement;

3document.body.onselectstart = cancelSelectionEvent;

4document.body.ondragstart = cancelEvent;

5window.onresize = repositionDragObjectArray;
当鼠标onmouseup时执行stop_dragDropElement,在stop_dragDropElement中通过调用saveData,saveData使用上文提到的CreateCallback完成服务器端的回调,其中saveString就是已排序的字符串,主要用于发送给服务器端程序处理。

总结

实际上在BlogEngine.Net的Web站点中还有很多比较有用的东西值得我们去研究,例如FilterByApml的实现,对文章的评分,邮件的发送等,这里就不做更多的讨论。关于在线评论预览我个人觉得没有必要去回调服务器,完全可以由客户端搞定,不知道大家是怎么想的。那个Widget的排序一直都深深的吸引着我,这种处理我见得很少,所以拿出来分享。

在本系列的最后一篇文章中我会就BlogEngine.Net的优秀部分和不太推荐的部分做一个总结,并谈一下我对它的感受,希望大家继续关注。

坚持写完,坚持看完。

上一篇:BlogEngine.Net架构与源代码分析系列part13:实现分析(上)——HttpHandlers与HttpModules

下一篇:BlogEngine.Net架构与源代码分析系列part15:总结篇

返回到目录
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐