[kooboo] 页面层现过程
看了一下代码,它的页面展现过程的一个大致分析。
首先看 web.config
<httpModules>
<remove name="UrlRoutingModule-4.0"/>
<add name="UrlRoutingModule-4.0" type="Kooboo.CMS.Sites.Web.FrontUrlRoutingModule,Kooboo.CMS.Sites"/>
<add name="KoobooCMSResponseHeader" type="Kooboo.CMS.Sites.Web.KoobooCMSResponseModule,Kooboo.CMS.Sites"/>
<add name="StartPagePublishingJob" type="Kooboo.CMS.Sites.Services.StartPagePublishingJobModule,Kooboo.CMS.Sites"/>
</httpModules>
第一步,特别是 Kooboo.CMS.Sites.Web.FrontUrlRoutingModule 这个,基本代码如下:
- protected override void Init(HttpApplication application)
- {
- application.PostResolveRequestCache += new EventHandler(application_PostResolveRequestCache);
- }
- void application_PostResolveRequestCache(object sender, EventArgs e)
- {
- HttpContextBase context = new FrontHttpContextWrapper(((HttpApplication)sender).Context);
- this.PostResolveRequestCache(context);
- //if (Site.Current != null)
- //{
- // UrlRedirect(context);
- //}
- }
FrontHttpContextWrapper , 对httpRequest 及 httpRespone 进行了包装。
关于 httpModule 与 HttpHander 异同参见:http://www.cnblogs.com/cyan/archive/2009/02/04/1383580.html
2,根据 Kooboo.Web.Mvc.Routing.RouteTableRegister.RegisterRoutes(routes); 所设置的路由,将请求路由至相关的 Area , controller 及action
配置于 routes.config 中,
其它的我们先不关心,我们从
<add name="Page" url="{*PageUrl}">
<defaults controller = "Page" action = "Entry" PageUrl=""></defaults>
<dataTokens Namespaces="Kooboo.CMS.Sites.Controllers.Front"/>
</add>
开始起步。
在上面的路由中的设置,除了忽略列表中的,以及上面没有匹配到的所有的 url 都会被 Page.Entry() 处理。
3,开始进入的最广泛的代码处理了。
public class PageController : FrontControllerBase
{
public Page_Context PageContext
{
get
{
return Page_Context.Current;
}
}
[SiteOfflinedFilter(Order = 0)]
[CustomRedirectFilter(Order = 5)]
[PageExecutionFilter(Order = 10)]
[OutputCacheFilter(Order = 15)]
public virtual ActionResult Entry()
{
//.....
}
}
可见 , Page 派生自 FrontController, Front暂时我们不理会他们吧。
Entry 被加上了几个Filter,
siteofflined 判断这个系统是否在线上,否则。。。。
CustonRedirect : 对应于用户自定义的跳转。
PageExecutionFilter: 初始化页面层现的参数,PageContext, Page,Site 等。
OutputCacheFilter:设置浏览器及服务器端页面缓存
4,进入 Entry内部
- var actionResult = Page_Context.Current.ExecutePlugins(); 插件,
- Page_Context.Current.ExecuteDataRules(); 执行数据, 放于 ViewState【】 中,
- Page_Context.Current.InitializeTitleHtmlMeta(); 页面中 HtmlMeta
if (Page_Context.Current.ExecuteModuleControllerAction())
{
return ViewPage();
}
如果 ModelController 的
actionResult is FileResult
|| actionResult is PartialViewResult
|| actionResult is JsonResult
|| actionResult is ContentResult
|| actionResult is JavaScriptResult
|| actionResult is RedirectToRouteResult;
直接返回结果
否则 ViewPage….