ASP.NET MVC从诞生到现在已经好几个年头了,这个框架提供一种全新的开发模式,更符合web开发本质。你可以很好的使用以及个性化和扩展这个框架,但这需要你对它有足够的了解。这篇文章主要从整体角度总结一下MVC的处理模型。

整体处理模型

先放一张图(图最直观而且很有说服力):

下面开始解释各个部分:

路由模块

1.在ASP.NET MVC处理管线中的第一站就是路由模块。当请求到达路由模块后,MVC框架就会根据Route Table中配置的路由模板来匹配当前请求以获得对应的controller和action信息。具体的匹配过程就是有UrlRoutingModule(System.Web.Routing.UrlRoutingModule)来实现的。

2.当ASP.NET MVC应用程序第一次启动的时候,路由系统就会把我们注册的路由规则(拦截哪些请求)加到Route Table中,一个应用程序包含一个Route Table,在Global.asax中的Application_Start事件中被创建:

public class RouteConfig{public static void RegisterRoutes(RouteCollection routes){routes.IgnoreRoute("{resource}.axd/{*pathInfo}");routes.MapRoute(name: "Default",url: "{controller}/{action}/{id}",defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional });}}protected void Application_Start()
{ RouteConfig.RegisterRoutes(RouteTable.Routes);
}

3.当UrlRoutingModule在Route Table中找到一条匹配的路由规则时,就会为这条路由规则寻找对应的IRouteHandler(System.Web.Mvc.IRouteHandler)实例(默认是System.Web.MvcRouteHandler),根据这个RouteHandler最后获取一个IHttpHandler的实例(默认是System.Web.MvcHandler)

public interface IRouteHandler
{IHttpHandler GetHttpHandler(RequestContext requestContext);
}

Controller初始化

1.在MvcHandler中的ProcessRequest方法中就是ASP.NET MVC的生命周期,这个方法使用IControllerFactory的实例(默认是System.Web.Mvc.DefaultControllerFactory)来创建相应的controller:

protected internal virtual void ProcessRequest(HttpContextBase httpContext)
{SecurityUtil.ProcessInApplicationTrust(delegate {IController controller;IControllerFactory factory;this.ProcessRequestInit(httpContext, out controller, out factory);try{controller.Execute(this.RequestContext);}finally{factory.ReleaseController(controller);}});
}

Action的执行

1.当controller创建之后,紧接着就会执行自己的InvokeAction()方法:

public virtual bool InvokeAction(ControllerContext controllerContext, string actionName)

2.当选择完合适的action后,接着就是model binders(默认是System.Web.Mvc.DefaultModelBinder),它会从http请求的参数中提取数据并实现类型转换,数据校验(例如是否必填,数据格式等)以及是否自动装配到action方法的参数中System.Web.Mvc.DefaultModelBinder

3.Authentication Filter是mvc5中新增的一个Filter,它会先于authorization filter执行,目的是对访问用户的认证。在MVC5之前,认证和授权都是通过authorization filter来实现的,但现在这2个操作就分开来了,各自管各自喽。

4.Action filters有2个方法OnActionExecuting和OnActionExecuted分别在action执行前后执行。我们也可以通过实现IActionFilter接口来实现你个性化的过滤机制

5.接下来就是执行我们平时在action方法中写的代码了(根据请求相应结果)

ActionResult的执行

1.在ActionResult执行前后,仍然会有一个filter(ResultFilter),同样的,通过实现IResultFilter接口你可以定制自己的过滤逻辑。

2.ActionResult就是把BAL DAL处理的用户请求结果返回。因此ViewResult, PartialViewResult, RedirectToRouteResult, RedirectResult, ContentResult, JsonResult, FileResult and EmptyResult就是具体的返回类型

3.上面的返回类型可以大致分为2类:ViewResult和非ViewResult。对于需要生成html页面给客户端的划到ViewResult,而其他的例如返回文本,json数据等则划分到非ViewResult,对于非ViewResult直接返回就可以了。

View的初始化和渲染呈现

1.对于ViewResult最终是由合适的View Engine通过调用IView的Render()方法来渲染View的:

public interface IView
{void Render(ViewContext viewContext, TextWriter writer);
}

2.整个处理过程是由IViewEngine(System.Web.Mvc.IViewEngine)来实现的。ASP.NET MVC 默认提供webform(.aspx)和Razor(.cshtml)模板引擎,你可以通过实现IViewEngine接口来实现你自己的ViewEngine,然后在Application_Start方法中做如下注册:

protected void Application_Start()
{ //移除所有的View引擎包括Webform和Razor
 ViewEngines.Engines.Clear();//注册你自己的View引擎
 ViewEngines.Engines.Add(new CustomViewEngine());
}

3.最后,Html Helpers将帮我们生成input标签,基于AJAX的form等等。Html Helpers是HtmlHelper类的扩展方法,因此想要进一步扩展也是非常容易的。

总结

整个流程做了一个简单的介绍,算是对自己学习MVC的一次总结和回顾,也希望帮助你在以后更好的使用和扩展MVC。

参考地址:http://www.dotnet-tricks.com/Tutorial/mvc/LYHK270114-Detailed-ASP.NET-MVC-Pipeline.html

漫步ASP.NET MVC的处理管线相关推荐

  1. 13个 ASP.NET MVC 的扩展

    ASP.NET MVC设计的主要原则之一是可扩展性.处理管线(processing pipeline)上的所有(或大多数)东西都是可替换的.因此,如果您不喜欢ASP.NET MVC所使用的约定(或缺乏 ...

  2. ASP.NET MVC中你必须知道的13个扩展点

         ScottGu在其最新的博文中推荐了Simone Chiaretta的文章13 ASP.NET MVC extensibility points you have to know,该文章为我 ...

  3. 13个不可不知的ASP.NET MVC扩展点

    ASP.NET MVC设计的主要原则之一是可扩展性.处理管线(processing pipeline)上的所有(或大多数)东西都是可替换的.因此,如果您不喜欢ASP.NET MVC所使用的约定(或缺乏 ...

  4. Asp.Net MVC 身份验证-Forms

    Asp.Net MVC 身份验证-Forms 在MVC中对于需要登录才可以访问的页面,只需要在对应的Controller或Action上添加特性[Authorize]就可以限制非登录用户访问该页面.那 ...

  5. 写自己的ASP.NET MVC框架(上)

     开始 ASP.NET程序的几种开发方式 介绍我的MVC框架 我的MVC框架设计架构 回忆以往AJAX的实现方式 MyMVC中实现AJAX的方式 如何使用MyMVC框架中的AJAX功能 配置MyM ...

  6. 写自己的ASP.NET MVC框架(下)

     开始 MyMVC的特点 介绍示例项目 关于URL路由 配置MyMVC框架 映射处理器(入口) 内部初始化 从URL到Action的映射过程 PageUrl的设计思想 多URL的匹配功能 解决老的 ...

  7. asp.net mvc、asp.net url重写 Url Rewrite

    最近在做一个cms手机网站,由于内容不是很多,很快做完了.空闲的时间考虑seo,想把url全部写成静态的.在查资料的时候,发现 UrlRewrite.Net这个组件非常的不错,尝试了下结果达到了理想的 ...

  8. ASP.NET MVC 2示例Tailspin Travel

    Tailspin Travel 是一个旅游预订的应用程序示例,最新版本采用ASP.NET MVC 2技术构建,主要使用 DataAnnotations 验证, 客户端验证和ViewModels,还展示 ...

  9. Asp.net MVC中的ViewData与ViewBag

    在Asp.net MVC 3 web应用程序中,我们会用到ViewData与ViewBag,对比一下: ViewData ViewBag 它是Key/Value字典集合 它是dynamic类型对像 从 ...

最新文章

  1. 每日一皮:叫你们别上泰坦尼克,嗓子都喊哑了!没一个听我的,最后还把我......
  2. hbuilderx简单网页代码_Python爬取网页数据
  3. mysql bandwidth_内存带宽对mysql影响多大
  4. VTK:图片之ImageDivergence
  5. jQuery动画高级用法(上)——详解animation中的.queue()函数
  6. 第九章:Java_枚举类和注解
  7. 10G_Ethernet_02 10G Ethernet Subsystem 简介
  8. 1106: 回文数(函数专题)
  9. 基于Cache的Fibonacci数列的计算
  10. [C#学习]在多线程中如何调用Winform[转]
  11. Python中执行系统命令常见的几种方法
  12. delphi备份Oracle,Oracle数据库自动备份工具(Delphi源码)
  13. mysql 怎么存储毫秒_MySQL如何存储毫秒数据
  14. 移动APP开发框架盘点
  15. SNMP原理和MIB库
  16. linux更换浏览器,ubuntu 默认浏览器换Chrome 是正确的选择
  17. Android——Timer停不下来的解决方法
  18. 网吧模式一台服务器拖显示器,摆500台机器太傻 网咖显示器如何配置?
  19. 表现与数据分离、web语义化的理解
  20. 麒麟系统挂载文件、麒麟系统挂载windows共享文件夹

热门文章

  1. 信息学奥赛一本通 2023:【例4.8】数据统计
  2. 信息学奥赛一本通(1136:密码翻译)
  3. 信息学奥赛一本通(1027:输出浮点数)
  4. 相离的圆(51Nod-1278)
  5. Lines(HDU-5124)
  6. 炮兵阵地(POJ-1185)
  7. 还是畅通工程(HDU-1233)
  8. 信息学奥赛一本通C++语言——1039:判断数正负
  9. android 蓝牙通知,android – 蓝牙低能耗通知
  10. python怎么对文件行排序_使用Python对文本文件进行排序