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:总结篇
返回到目录
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:总结篇
返回到目录
相关文章推荐
- BlogEngine.Net架构与源代码分析系列part13:实现分析(上)——HttpHandlers与HttpModules
- BlogEngine.Net架构与源代码分析系列part12:页面共同的基类——BlogBasePage
- BlogEngine.Net架构与源代码分析系列part9:开发扩展(上)——Extension与管理上的实现
- BlogEngine.Net架构与源代码分析系列part8:扩展——DataStore分析
- BlogEngine.Net架构与源代码分析系列part4:Blog全局设置——BlogSettings
- BlogEngine.Net架构与源代码分析系列part4:Blog全局设置——BlogSettings
- BlogEngine.Net架构与源代码分析系列part4:Blog全局设置——BlogSettings
- BlogEngine.Net架构与源代码分析系列part15:总结篇
- BlogEngine.Net架构与源代码分析系列part7:Web2.0特性——Pingback&Trackback
- BlogEngine.Net架构与源代码分析系列part4:Blog全局设置——BlogSettings
- BlogEngine.Net架构与源代码分析系列part3:数据存储——基于Provider模式的实现
- BlogEngine.Net架构与源代码分析系列part5:对象搜索——IPublishable与Search
- BlogEngine.Net架构与源代码分析系列part5:对象搜索——IPublishable与Search
- BlogEngine.Net架构与源代码分析系列part3:数据存储——基于Provider模式的实现
- BlogEngine.Net架构与源代码分析系列part5:对象搜索——IPublishable与Search
- BlogEngine.Net架构与源代码分析系列part10:开发扩展(中)——Widget小工具
- BlogEngine.Net架构与源代码分析系列part3:数据存储——基于Provider模式的实现
- BlogEngine.Net架构与源代码分析系列part5:对象搜索——IPublishable与Search
- BlogEngine.Net架构与源代码分析系列part6:开放API——MetaWeblog与BlogImporter
- BlogEngine.Net架构与源代码分析系列part3:数据存储——基于Provider模式的实现