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];
        }
    }
  • 相关阅读:
    arcpy脚本使用多接图表图斑对对应多幅影像进行裁边处理
    小辉轶事
    一些常ArcGIS常用简单算法 C#
    Wowza 4.5 修改 manager 端口号
    win7x64 串口程序无法运行,提示:component 'MSCOMM32.OCX' or one of its dependencies not correctlu registered。。。
    win7不正常开关机,系统恢复选项
    远程桌面+程序自启动
    Beyond Compare4 激活
    edusoho 支持同一账号多人同时登录
    windows 2008 gpt
  • 原文地址:https://www.cnblogs.com/cuijl/p/7403536.html
Copyright © 2011-2022 走看看