前言

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

最新文章

  1. setEllipsize(TruncateAt where)
  2. HDU 3642 Get The Treasury 线段树+分层扫描线
  3. The Basics
  4. css制作导航栏的上下三角
  5. Ubuntu 字体安装
  6. 哥的第一个Jquery程序
  7. Eclipse汉化后怎么改回英文版 (中文 改 英文)
  8. iOS应用拨打电话
  9. HBase源代码分析
  10. (大数据工程师学习路径)第四步 SQL基础课程----约束
  11. LeetCode 328. Odd Even Linked List C#
  12. problem 202,263、232、21、231
  13. Python里Pure paths、PurePosixPath、PureWindowsPath的区别
  14. Azure VM 防止被入侵
  15. 再谈ERP选型
  16. Vim实现分屏
  17. BZOJ3105-新Nim游戏
  18. QT: 自定义断言;
  19. jquery checkbox checked 却不显示对勾
  20. usdt转入转出出入金开发

热门文章

  1. Hoj_平方和与立方和
  2. DataGridview绑定复杂对象
  3. Windows上部署Python
  4. Ubuntu 16.04 安装 Django==1.11.8
  5. JsonNetResult
  6. Css进阶练习(实现抽屉网样式布局)
  7. C++基础 (10) 第十天 C++中类型转换 异常 栈解旋 io操作
  8. [SCOI2010] 股票交易 (单调队列优化dp)
  9. [HEOI2013]Eden 的新背包问题
  10. matplotlib 显示两张图片,折线图 和 scipy