Route学习笔记

Posted 付出才有回报,敢于尝试才能成功。

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Route学习笔记相关的知识,希望对你有一定的参考价值。

前言

  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];
    }
}

 

以上是关于Route学习笔记的主要内容,如果未能解决你的问题,请参考以下文章

python学习笔记-flask学习

[原创]java WEB学习笔记61:Struts2学习之路--通用标签 property,uri,param,set,push,if-else,itertor,sort,date,a标签等(代码片段

linux学习笔记31--命令route

vue-router学习笔记

DOM探索之基础详解——学习笔记

odoo10学习笔记十二:web controller