路由规则可以注册多条,
路由规则的名称不能重复
路由规则有顺序,并且按照顺序进行匹配,建议小范围写在前,大范围写在后。
路由规则可以设置约束 即正则表达式
路由规则匹配的控制器可以设置命名空间约束
routes.MapRoute(
name: "NewShow",
url: "{year}-{month}-{day}-{id}",
defaults: new { controller = "News", action = "Show" },
constraints:new
{
year=@"^d{4}$",
month = @"^d{1,2}$",
day = @"^d{1,2}$"
}
);
routes.MapRoute(
// 1.参数name设置路由规则的名称必须是唯一的,重复会报异常默认添加”Default”的路由规则
name: "Default",
//2.参数url设置url的路由规则,可变的值使用{}括起来关键字controller、action名称不可变
url: "{controller}/{action}/{id}",
//3.参数defaults设置路由规则中参数的默认值类型为object,可以传递一个匿名对象,属性取决于规则中定义的参数参数UrlParameter.Optional表示可选的只读参数如果在实际的url中没有指定路由规则中某些参数,则会使用默认值作为参数的值使用
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
路由中的几个对象:
1.路由规则Route:可以查看源代码了解一下构造方法,需要指定路由格式,默认值,处理器三个值。代码如下:
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
2. 路由数据RouteData:当前请求上下文匹配路由规则而得到的一个对象,可以在Action中通过RouteData.GetRequestString("controller/action")获取本些请求中控制或行为的真实名称
3.路由集合RouteCollection:存放路由规则的集合Collection<RouteBase>,一个MVC项目中,可以配置多个路由规则,按照键值对的格式存储到路由集合中
4.路由表RouteTable:类中包含静态的RouteCollection属性,完成所有路由规则的全局存储,在Global中完成注册
客户的请求过程为:
当一个客户请求过来时,HttpContext请求到RouteCollection中去RouteTable中的第个键值对的Route比对 如果有一个比对路由规则比对成功,则生成一条RouteData数据进而跳转到对应Cotroller的Action中去进行相应的处理。
优点:
能够根据系统需求,灵活的划分请求规则(不同模块请求的 URL 是不一样的)。
屏蔽物理路径,提高系统的安全性,以上情况是无法根据 URL 分析视图文件在站点目录中的位置。
有利于搜索引擎优化,可以将 URL 请求统一规范,以后维护中,如果页面发生变化,URL 可以保持不变
URL 模式的定义:
占位符:可以是一个字符串或字符,比如“x”、“id”、“year”等。
字面量:可能是一个比较固定的字符,比较常见的是斜杠“/”;也可以是字符串。
特殊规则:不能以斜杠“/”或波浪线“~”字符开头,不能包含“?”,同时占位符也不能连续。
匹配要求:
1、
1 字面量:必须严格匹配,即实际请求的 URL 中的字符串和路由模式中的字面量字符串必须完全一致。
2 大小写:URL 模式匹配是不区分大小写。
3 常量:没有包含在大括号内的信息被作为一个常量对待;比如上面的 Course,以及在分区项目中路由的定义
2、
路由的匹配原则:如果一个 URL 能够在多个路由中匹配,则默认使用第一个匹配的路由。
UrlPrameter.Optional 的参数作用是什么?该参数可以作为路由参数的默认值,当需要让“/Home/Index” 或“/Home”能正常匹配,但又不希望赋一个无意义的值,可以使用该参数。
3、
关于{controller}/{action}
必不可少:在一个实际的 MVC 系统中, {controller}和{action} 必不可少,如果缺少就会找不到路径而出错。
约定规则:这个占位符是 MVC 里面约定的,并且会被解析成控制器和对应的方法。
位置灵活:这两个约定的占位符可以在任意位置。
4、
其他占位符
仅仅占位:其他占位符只起到占位而已,比如{aa}/{bb}/{cc}是不能把 aa 解析成控制器,bb 解析成动作方法。默认要求:一个路由中,如果没有规定{controller}和{action},或者只是规定其中之一,则没有规定的部分都将使用默认值。
如果你在路由里面没有写Controller 和 action 那么你在默认值里 一定要配
routes.MapRoute(
// 1.参数name设置路由规则的名称必须是唯一的,重复会报异常默认添加”Default”的路由规则
name: "Default",
//2.参数url设置url的路由规则,可变的值使用{}括起来关键字controller、action名称不可变
url: "{controller}/{action}/{id}",
//3.参数defaults设置路由规则中参数的默认值类型为object,可以传递一个匿名对象,属性取决于规则中定义的参数参数UrlParameter.Optional表示可选的只读参数如果在实际的url中没有指定路由规则中某些参数,则会使用默认值作为参数的值使用
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);路由的调试,在我们开发的 时候可以使用RouteDeugger进行路由的调试,看我们写的路由有没有启作用,用法 如下把RouteDebug.dll添加引用,在Global.asax.cs中注册路由之后 添加 RouteDebug.RouteDebugger.RewriteRoutesForTesting(RouteTable.Routes);