深入理解ASP.NET MVC(目录)、打造自己的MVC框架

来源:互联网 发布:java初级工程师招聘 编辑:程序博客网 时间:2024/06/06 03:57

http://www.cnblogs.com/P_Chou/archive/2010/11/01/details-asp-net-mvc-content.html

一、URL路由职责

1、URL机制包括两个主要的工作:

A.URL正向映射(inbound)到Controller和Action

B.Controller和Action反向映射(outbound)并构造URL

2、设置路由
先来回顾一下基本的内容。应用程序初次启动时需要像下面这样注册一个URL:

routes.MapRoute(null,    "{controller}/{action}",    new { controller = "CarView", action = "Index" } );

上面代码的MapRoute其实是RouteCollection的一个扩展方法,它有多个重载,先来看看MapRoute最复杂的一个重载版本的源码:

public static Route MapRoute(this RouteCollection routes, string name, string url, object defaults, object constraints, string[] namespaces) {    if (routes == null) {        throw new ArgumentNullException("routes");    }    if (url == null) {        throw new ArgumentNullException("url");    }     Route route = new Route(url, new MvcRouteHandler()) {        Defaults = new RouteValueDictionary(defaults),        Constraints = new RouteValueDictionary(constraints)    };     if ((namespaces != null) && (namespaces.Length > 0)) {        route.DataTokens = new RouteValueDictionary();        route.DataTokens["Namespaces"] = namespaces;    }     routes.Add(name, route);     return route;}

MapRoute做的事情就是构造一个Route对象,将它加到全局的RouteCollection(RouteTable.Routes)中。RouteCollection是RouteBase的集合,Route对象继承自RouteBase。先简单看看Route对象的一些属性:

属性名 描述

Url(string) 将要被匹配的URL模型,其中用{}定义参数名。如:{controller}/{action}

RouteHandler(IRouteHandler) 当Route匹配的时候,IRouteHandler应当处理request  如:MVCRouteHandler

Defaults(RouteValueDictionary) 为参数提供一个默认值表 如:new { controller = "CarView", action = "Index" } )
Constraints(RouteValueDictionary) 为参数提供匹配规则表
DataTokens(RouteValueDictionary) 为route handler提供一个选择controller的依据,主要用于Areas机制
这些属性将在下面的内容中深入讨论。

二、URL inbound过程,以及IRouteConstraint(规则)的实现

当一个URL请求到来时,系统调用一个注册的IHttpModules:UrlRoutingModule,它将完成如下工作:
1、在RouteTable.Route中从第一个Route开始查找第一个匹配当前URL的Route.
2、Route的GetRouteData方法提供一个RouteData结构,RouteData包含如下四个属性:

A.Route:Route对象自己;

B.RouteHandler:一个实现了IRouteHandler的对象,MVC提供一个MvcRouteHandler类,从MapRoute的源码可以看出,总由MvcRouteHandler担任这个角色。MvcRouteHandler知道如何从RouteData中寻找Controller和Action。事实上MvcRouteHandler会寻找键值为"controller"和"action"参数,所以我们永远需要包含"controller"和"action"两个参数;

C.Values:保存URL中参数的值字典,参数包括{}定义的,Route.Defaults中的,以及从QueryString中获得的;

D.DataTokens:一个附加的字典,主要用于Areas机制,以后会详细讨论。

3、调用RouteData中的RouteHandler,同时为RouteHandler提供包括RouteData和HttpContextBase对象等上下文变量,并封装成一个叫requestContext的参数传递给RouteHandler。如果使用MvcRouteHandler,那么至此,就进入了MVC框架。


自定义参数匹配规则
Route的Constraints定义URL中参数匹配规则,规则可能是一个正则式,或是一个IRouteConstraint对象
我之前一篇文章ASP.NET MVC的全球化方案中有一个IRouteConstraint的实现。
还有个例子,MVC框架有个HttpMethodConstraint实现了IRouteConstraint,我们可以像下面这样使用:

routes.MapRoute(null, "Articles/{id}", new { controller = "Articles", action = "Show" }, new { httpMethod = new HttpMethodConstraint("GET") } );
这表示只有以GET方式请求的URL才能匹配这个Route。需要注意的是,我们常常会在Action上加上[HttpGet]或[HttpPost]来做类似的限定,但两者完全不同,这里的限定是在MVC框架外的,而[HttpGet]是在框架内的,显然这种方法高效些。

三、URL是如何通过路由表生成的(outbound)

view设计时使用Html.ActionLink(…)产生链接,这样做的优势就是,url可以根据路由表生成。

四、DataTokens和Areas机制


认识ASP.NET MVC的5种AuthorizationFilter

https://www.cnblogs.com/artech/archive/2012/07/02/AuthorizationFilter.html

打造自己的MVC框架(一:核心原理)