zoukankan      html  css  js  c++  java
  • 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];
        }
    }
  • 相关阅读:
    10. Regular Expression Matching
    9. Palindrome Number
    6. ZigZag Conversion
    5. Longest Palindromic Substring
    4. Median of Two Sorted Arrays
    3. Longest Substring Without Repeating Characters
    2. Add Two Numbers
    链式表的按序号查找
    可持久化线段树——区间更新hdu4348
    主席树——树链上第k大spoj COT
  • 原文地址:https://www.cnblogs.com/cuijl/p/7403536.html
Copyright © 2011-2022 走看看