前言
UrlRoutingModule.class;这块的代码关联了上一篇中路由部分的一个详细说明
一:Route的讲解
1. 路由模板匹配
添加路由: MapRoute
剔除的路由:IgnoreRoute
2. 简单看mapRoute 和IgnoreRoute的源码。
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 是 StopRoutingHandler
过程:
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]; } }
时间: 2024-10-06 21:52:09