Route學習筆記

前言

  UrlRoutingModule.class;這塊的代碼關聯了上一篇中路由部分的一個詳細說明this

一:Route的講解

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

二:constraints約束 

就是對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];
    }
}
相關文章
相關標籤/搜索