前言

  UrlRoutingModule.class;这块的代码关联了上一篇中路由部分的一个详细说明

一:Route的讲解

1. 路由模板匹配

添加路由: MapRoute

剔除的路由:IgnoreRoute

2. 简单看mapRoute 和IgnoreRoute的源码。

 RouteTable
=> Routes [RouteCollection]
=> Route 【就是我们定义的路由模板】
① 构建: [MvcRouteHandler]
Route item = new Route(url, new MvcRouteHandler()) {
Defaults = CreateRouteValueDictionary(defaults),
Constraints = CreateRouteValueDictionary(constraints),
DataTokens = new RouteValueDictionary()
};
② 加入到Collection中去
routes.Add(name, item); IgnoreRoute =>
① 构建: 【[StopRoutingHandler]】
IgnoreRouteInternal item = new IgnoreRouteInternal(url) {
Constraints = new RouteValueDictionary(constraints)
};
② 加入到Collection中去
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中可以定义两种约束,第一种字符串,第二种自定义。

 bool ProcessConstraint(HttpContextBase httpContext,object constraints,string parameterName,...)
{
object obj2;
//判断是否是自定义约束
IRouteConstraint constraint2=constraint as IRouteConstraint;
if(constraint2!=null){
return constraint2.Match(httpContext,this,values,routeDirection);
}
//如果是系统约束判断字符串
string str=constraint as string;
if(str==null){...}
values.TryGetValue(parameterName,out obj2);
return Regex.IsMatch(正则匹配)
}

2. 自定义约束:IRouteConstraint

public class MyRoute:IRouteConstraint{
match(....){
//values是真正的值字典
var id=values[parameterName];
}
}

Route学习笔记的更多相关文章

  1. Route学习笔记之Area的Route注册

    前一段时间接触了MVC的Area可以将模型.控制器和视图分成各个独立的节点.分区之后,区域路由注册的需求就出来了. 默认的 在MVC项目上右键添加区域之后,在文件夹下会自动添加一个FolderName ...

  2. (学习笔记)laravel 中间件

    (学习笔记)laravel 中间件 laravel的请求在进入逻辑处理之前会通过http中间件进行处理. 也就是说http请求的逻辑是这样的: 建立中间件 首先,通过Artisan命令建立一个中间件. ...

  3. MyCat 学习笔记 第十篇.数据分片 之 ER分片

    1 应用场景 这篇来说下mycat中自带的er关系分片,所谓er关系分片即可以理解为有关联关系表之间数据分片.类似于订单主表与订单详情表间的分片存储规则. 本文所说的er分片分为两种: a. 依据主键 ...

  4. MyCat 学习笔记 第九篇.数据分片 之 数值分布

    1 应用场景 Mycat 自带了多套数据分片的机制,其实根据数值分片也是比较简单,其实这个和数据取摸是类似的实现. 优.缺点同上一篇 2 环境说明 参考  <MyCat 学习笔记>第六篇. ...

  5. MyCat 学习笔记 第八篇.数据分片 之 求摸运算分片

    1 应用场景 Mycat 自带了多套数据分片的机制,其实根据数值取摸应该是最简单的一种. 优点:数据离散概率较为平均,可以有效的提高应用的数据吞吐. 缺点:比较明显,后期数据运维与迁移比较困难.好在M ...

  6. MyCat 学习笔记 第七篇.数据分片 之 按数据范围分片

    1 应用场景 Mycat 其实自带了2个数据范围分片的方案,一个是纯数据范围的分片,比如 1至 10000 号的数据放到分片1 ,10001 至 20000号数据放到分片2里. 另一个是数据常量形式的 ...

  7. NSURLSession学习笔记

    NSURLSession学习笔记(一)简介 一.URL Session的基本概念 1.三种工作模式: 默认会话模式(default):工作模式类似于原来的NSURLConnection,使用的是基于磁 ...

  8. phalcon(费尔康)框架学习笔记

    phalcon(费尔康)框架学习笔记 http://www.qixing318.com/article/phalcon-framework-to-study-notes.html 目录结构   pha ...

  9. <老友记>学习笔记

    这是六个人的故事,从不服输而又有强烈控制欲的monica,未经世事的千金大小姐rachel,正直又专情的ross,幽默风趣的chandle,古怪迷人的phoebe,花心天真的joey——六个好友之间的 ...

随机推荐

  1. Sublime Text3 插件记录

    插件官网 其他插件安装之前,先安装 Package Control: 快捷键Ctrl+`或View > Show Console打开控制台. 输入以下 Python 代码,回车. import ...

  2. poj1111 Image Perimeters 广搜

    题目大意: 输入一个矩阵,再输入其中一个“X”的位置(从1开始).从该位置向八个方向扩展,如果是“X”就可以并在一起.问最后得到的模块的周长是多少. 解题思路: 按照广搜的思路来做.用一个二维的数组标 ...

  3. RabbitMQ学习之spring配置文件rabbit标签的使用

    下面我们通过一个实例看一下rabbit的使用. 1.实现一个消息监听器ReceiveMessageListener.Java package org.springframework.amqp.core ...

  4. css常用代码大全以及css兼容(转载)

    css常见的快捷开发代码汇总(长期更新),包括CSS3代码,有一些css效果很顽固,经常会一时找不出解决方案,网络上也有很多的工具和高手提供了具体的浏览器兼容代码,这个页面我今后会经常整理,希望能够帮 ...

  5. Redmine 甘特图导出 PDF 和 PNG 中文乱码问题

    Redmine使用了RMagick来处理图片,fpdf处理PDF,并在调用时设定了字体PDF中文字体 redmine 中关于PDF字体设置的代码 case pdf_encoding           ...

  6. windows 端口号占用和解决方法

    https://blog.csdn.net/qq_39657909/article/details/80378983

  7. centos7 选定默认启动内核,及删除无用内核

    #使用cat /boot/grub2/grub.cfg |grep menuentry 查看系统可用内核 [root@bigapp-slave27 ~]# cat /boot/grub2/grub.c ...

  8. Win 10安装mysql以及常见问题总结

    一.mysql免安装版本配置1.从官网下载安装包,解压后,在电脑属性环境变量的path中配置bin的路径 2.配置my.ini [mysql] # 设置mysql客户端默认字符集 default-ch ...

  9. 【vue】v-if和v-show的区别

    今天来捋一下vue中的v-if与v-show的区别 先来看一下vue官方文档对他们的解释 2.从实现方式来看: v-if是当依赖的值变为false时,直接让元素消失,html代码也会消失,相当于直接在 ...

  10. BZOJ 3878 [AHOI&JSOI2014]奇怪的计算器 (线段树)

    题面:BZOJ传送门 洛谷传送门 线段树好题 题目保证$a$一定是正整数,容易发现计算结果是单调的 我们把询问离线,并按照从小到大排序 某次操作可能导致某些位置达到边界$L/R$ 根据单调性的结论 这 ...