Route学习笔记
前言
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学习笔记的更多相关文章
- Route学习笔记之Area的Route注册
前一段时间接触了MVC的Area可以将模型.控制器和视图分成各个独立的节点.分区之后,区域路由注册的需求就出来了. 默认的 在MVC项目上右键添加区域之后,在文件夹下会自动添加一个FolderName ...
- (学习笔记)laravel 中间件
(学习笔记)laravel 中间件 laravel的请求在进入逻辑处理之前会通过http中间件进行处理. 也就是说http请求的逻辑是这样的: 建立中间件 首先,通过Artisan命令建立一个中间件. ...
- MyCat 学习笔记 第十篇.数据分片 之 ER分片
1 应用场景 这篇来说下mycat中自带的er关系分片,所谓er关系分片即可以理解为有关联关系表之间数据分片.类似于订单主表与订单详情表间的分片存储规则. 本文所说的er分片分为两种: a. 依据主键 ...
- MyCat 学习笔记 第九篇.数据分片 之 数值分布
1 应用场景 Mycat 自带了多套数据分片的机制,其实根据数值分片也是比较简单,其实这个和数据取摸是类似的实现. 优.缺点同上一篇 2 环境说明 参考 <MyCat 学习笔记>第六篇. ...
- MyCat 学习笔记 第八篇.数据分片 之 求摸运算分片
1 应用场景 Mycat 自带了多套数据分片的机制,其实根据数值取摸应该是最简单的一种. 优点:数据离散概率较为平均,可以有效的提高应用的数据吞吐. 缺点:比较明显,后期数据运维与迁移比较困难.好在M ...
- MyCat 学习笔记 第七篇.数据分片 之 按数据范围分片
1 应用场景 Mycat 其实自带了2个数据范围分片的方案,一个是纯数据范围的分片,比如 1至 10000 号的数据放到分片1 ,10001 至 20000号数据放到分片2里. 另一个是数据常量形式的 ...
- NSURLSession学习笔记
NSURLSession学习笔记(一)简介 一.URL Session的基本概念 1.三种工作模式: 默认会话模式(default):工作模式类似于原来的NSURLConnection,使用的是基于磁 ...
- phalcon(费尔康)框架学习笔记
phalcon(费尔康)框架学习笔记 http://www.qixing318.com/article/phalcon-framework-to-study-notes.html 目录结构 pha ...
- <老友记>学习笔记
这是六个人的故事,从不服输而又有强烈控制欲的monica,未经世事的千金大小姐rachel,正直又专情的ross,幽默风趣的chandle,古怪迷人的phoebe,花心天真的joey——六个好友之间的 ...
随机推荐
- hdu2680 Choose the best route 最短路(多源转单源)
此题中起点有1000个,边有20000条.用链式前向星建图,再枚举起点用SPFA的话,超时了.(按理说,两千万的复杂度应该没超吧.不过一般说计算机计算速度 1~10 千万次/秒.也许拿最烂的计算机来卡 ...
- 我的wordpress在Nginx的配置
lnmp生成过程 You select the exist rewrite rule:/usr/local/nginx/conf/wordpress.conf Gracefully shutting ...
- 模拟试题A
模拟试题A 一.单项选择题(2′*12=24′) 1.下面各种坐标变换中,会产生变换前后维度的改变的是( ) A)建模变换 B)观察变换 C)投影变换 D)视口变换 2.下列描述深度缓冲消隐算法的特点 ...
- 11.05 选择前n个记录
select ename,salfrom(select (select count(distinct b.sal)from emp bwhere a.sal<=b.sal) as rnk,a.s ...
- 第一个TensorFlow程序
第一个TensorFlow程序 TensorFlow的运行方式分为如下4步: (1)加载数据及定义超参数 (2)构建网络 (3)训练模型 (4)评估模型和进行预测 import tensorflow ...
- jQuery删除元素
remove() - 删除被选元素(及其子元素) empty() - 从被选元素中删除子元素 $("#div1").remove();删除被选元素及其子元素. $("#d ...
- 获取Centos7安装Docker各种姿势(指定版本)(转载)
Centos7安装docker社区(CE)版 官网指导:https://docs.docker.com/engine/installation/linux/docker-ce/centos/#inst ...
- jq DataTable
DataTables(http://datatables.club/index.html)应该是我到目前为止见过的,功能最强大的表格解决方案(当然,不计算其它整套框架中的table控件在内). 先把它 ...
- 小结ajax中的同源和跨域 jsonp和cors
网上的同源和跨域一般都比较复杂,最近也稍微总结了一下: 所谓同源,是浏览器的一种安全机制,作用在于保护网页数据的安全,不同源的网页之间不允许cookie dom ajax等行为 同源的条件:1.协议相 ...
- Bind for 0.0.0.0:80 failed: port is already allocated.解决方案
一句话总结就是容器占用的port还没有完全释放 查看进程,发现相关的容器并没有在运行,而 docker-proxy 却依然绑定着端口: $ docker ps 检查docker镜像 $ ps -aux ...