UrlRoutingModule.class;這塊的代碼關聯了上一篇中路由部分的一個詳細說明this
1. 路由模板匹配url
添加路由: MapRoutespa
剔除的路由:IgnoreRoutecode
2. 簡單看mapRoute 和IgnoreRoute的源碼。blog
1 RouteTable 2 => Routes [RouteCollection] 3 => Route 【就是咱們定義的路由模板】 4 ① 構建: [MvcRouteHandler] 5 Route item = new Route(url, new MvcRouteHandler()) { 6 Defaults = CreateRouteValueDictionary(defaults), 7 Constraints = CreateRouteValueDictionary(constraints), 8 DataTokens = new RouteValueDictionary() 9 }; 10 ② 加入到Collection中去 11 routes.Add(name, item); 12 13 IgnoreRoute => 14 ① 構建: 【[StopRoutingHandler]】 15 IgnoreRouteInternal item = new IgnoreRouteInternal(url) { 16 Constraints = new RouteValueDictionary(constraints) 17 }; 18 ② 加入到Collection中去 19 routes.Add(item);
結論:路由
經過源碼,咱們發現,Ignore和Map都是構建Route,而後添加到RouteCollection中去。。。字符串
不同地方在哪裏????源碼
MapRoute,咱們加入的Handler是 MVCRouteHanlder。。。
IgnoreRoute 咱們的Handler 是 StopRoutingHandlerstring
過程: it
http => foreach 去找Route,若是Route被匹配,同時還要判斷該Route的handler是什麼類型,若是是StopRoutingHandler,則直接跳出。
不然,GetRouteData
就是對url模板的參數進行限定;eg: {controller}/{action}/{id} 模板。。。
能夠對id進行限定,對action參數進行限定,,,,controller進行限定。。。
1. 我想作到輸入的url模板中,id只能是整數 。。。。
routes.MapRoute( name:"Defaults", url:"{controller}/{action}/{id}}", defaults:"new{controller="Home",action="Index",id=UrlParameter.Optional}, constraints:new{ id=@"\d+" } );
從源碼中發現,connstraint中能夠定義兩種約束,第一種字符串,第二種自定義。
1 bool ProcessConstraint(HttpContextBase httpContext,object constraints,string parameterName,...) 2 { 3 object obj2; 4 //判斷是不是自定義約束 5 IRouteConstraint constraint2=constraint as IRouteConstraint; 6 if(constraint2!=null){ 7 return constraint2.Match(httpContext,this,values,routeDirection); 8 } 9 //若是是系統約束判斷字符串 10 string str=constraint as string; 11 if(str==null){...} 12 values.TryGetValue(parameterName,out obj2); 13 return Regex.IsMatch(正則匹配) 14 }
2. 自定義約束:IRouteConstraint
public class MyRoute:IRouteConstraint{ match(....){ //values是真正的值字典 var id=values[parameterName]; } }