http://www.cnblogs.com/P_Chou/archive/2010/11/01/details-asp-net-mvc-content.html
一、URL路由职责
1、URL机制包括两个主要的工作:
2、设置路由A.URL正向映射(inbound)到Controller和Action
B.Controller和Action反向映射(outbound)并构造URL
先来回顾一下基本的内容。应用程序初次启动时需要像下面这样注册一个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机制