ASP.NET MVC就是把原来WebForm中的一个IHttpHandler换成了两个IHttpHandler。原来的Page(IHttpHandler)既负责业务逻辑又负责显示,在MVC中换成了两个IHttpHandler,第一个Handler负责业务逻辑,第一个Handler就是在ProcessRequest中构造Controller的那个Handler,然后第二个Handler(ASPX)纯粹是View,是用来显示的。把WebForm的一个IHttpHandler换成了两个IHttpHandler,MVC模式的业务被放置到Controller中去执行,而aspx页面只负责显示。
在MVC中的业务实际执行时间被提前到了HttpMolde中,而WebForm的请求只在httpHandler容器中被执行。也就是说MVC中Controller与View的分离是使用的ASP.Net请求管道隔离的,这样的话无疑在不影响效率(一次请求,而Response.Redirect是二次请求)的情况下达成了代码的逻辑层次的分离。
MVC工作的优点是显然的,更加有利于理解分层逻辑,把握代码的层次感。Controller到aspx页面之间的过程,已经被框架隔离。至于Controller或者View页面与Model调用的过程,还是需要自己来把握。ASP.NET的MVC框架实现了Controller代码的单独管理。
MVC框架具有很强的优越性,而WebForm也不是一无是处,在简单的应用中更加容易开发。WebForm也是可以实现和MVC一样的分层方式,只是处理时需要多写一些代码而已。用WebForm开发比MVC框架更容易理解,不会产生复杂的配置,也是一个很不错的选择。
在ASP.NET MVC中 Module级别的只有UrlRouting一个 其他都是在Handler中的
一个HTTP请求从IIS移交到Asp.net运行时,Asp.net MVC是在什么时机获得了控制权并对请求进行处理呢?PostResolveRequestCache和PostMapRequestHandler
我们使用VS2008中Asp.net Mvc模板创建一个Demo完成后续的讨论,当我们访问/Home的时候发生了什么呢?
1.Request 请求到来
2.IIS 根据请求特征将处理权移交给 ASP.NET
3.UrlRoutingModule将当前请求在 Route Table中进行匹配
4.UrlRoutingModule在RouteCollection中查找Request匹配的RouteHandler,默认是MvcRouteHandler MvcRouteHandler 创建 MvcHandler实例.
5.MvcHandler执行 ProcessRequest.
6.MvcHandler 使用 IControllerFactory 获得实现了IController接口的实例,找到对应的HomeController
7.根据Request触发HomeController的Index方法
8.Index将执行结果存放在ViewData
9.HomeController的Index方法返回 ActionResult
10.Views/Home/Index.aspx将 ViewData呈现在页面上
11.Index.aspx执行ProcessRequest方法
12.Index.aspx执行Render方法 输出到客户端
1.RouteData中获得ActionName
2.ActionInvoker.InvokeAction
3.通过ControllerContext获取ControllerDescriptor
4.FindAction-获取ActionDescriptor
5.GetFilters
6.ModelBinder把Request中的数据转换成Action方法需要的参数
7.AuthorizationFilter
8.Action Filter.OnActionExecuting
9.Action
10.ActionFilter.OnActionExecuted
11.ResultFilter.OnResultExecuting
12.ActionResult Execution
13.ResultFilter.OnResultExecuted
14.WebFormViewEngine.CreateView
15.WebFormView.Render
16.ResultFilter.OnExecuted
MVC模型在工作时是通过URL来选择应该执行哪个指定的控制器方法,并且任何的操作都会被引导至控制器中的特定方法。根据URL的格式将它们引导至特定的控制器,这种引导机制——就像MVC框架中的大部分东西一样——能够被很轻易地重新定义,这样你就能够使用不同的URL语法来将引导至特定的控制器。MVC框架在一定程度上回到了传统的ASP风格,那便是直接使用脚本来手动生成HTML的开发方式,而现在只是提供了一种更为严格的做法来将这种开发方式和代码逻辑区分开来