ASP.NET MVC 框架中的路由主要有两种用途:
1.匹配传入的请求,并把这些请求映射到控制器操作
2.构造传出的URL,用来响应控制器操作
1.对比路由和URL重写
RUL重写关注的是将一个URL映射到另一个URL,路由关注的则是如何将URL映射到资源。当传入 请求和路由匹配时就会执行该段代码。
2.路由方法
路由分为:传统路由和特性路由(mvc5新增的)
2.1定义特性路由
路由定义是从URL模板开始的,因为它指定了路由相匹配的模式。路由定义可以作为控制器类或操作方法的特性。路由可以指定它的URL及其默认值。
1.路由URL
我们需要把默认的RouteConfig修改一下。
注意:这个时候我们访问 /Home/About 是会报找不到资源的。 /About才是正确的
如果对于操作多个URL,就可以使用多个路由特性。例如:想让首页通过/、/home和/home/index这几个URL都能访问。
注:传入路由特性的字符串叫做路由模板,它就是一个模式匹配规则,决定了这个路由是否适用于传入的请求。 上面显示的是静态路由,没有传入参数。
2.路由值
有时候我们需要显示商品的信息,这个时候需要利用占位符 {xx}
当特性路由匹配并运行操作方法时,模型绑定会使用路由的路由参数为同名的方法参数填充值,后面会讨论路由参数与方法参数的不同点。
3.控制器路由
对于同一个控制器中,我们不不必针对每个操作方法,可以在看控制器头部申明。
在操作方法级别指定路由特性时,会覆盖控制器级别指定的任何路由特性。如果在Index()方法上只有第一个路由特性,尽管控制器有一个默认路由home/{action},也不能访问
home/index。 RoutePrefix,可以仅在一个地方路由以 home/开头。
4.路由约束
因为方法参数的名称正好位于路由特性及路由参数名称的下方,所有很容易忽视这两种参数的区别
5.路由的默认值
我们访问 routetest 会直接报错,定义的路由只匹配包含两个段的url
设置参数可选
6.定义传统路由
我们项目新建完成后,会生成一个RouteConfig.cs 里面会生成默认的 路由配置,我们直接F5运行项目,它会直接去找 test/index 这个方法
MapRoute 方法的最坚定形式是采用路由名称和路由模板(路由名称后面介绍)。路由模板是一种模式匹配规则,用来决定改路由是否应该处理传入的请求(基于请求的URL决定)。特性路由和传统路由最大的区别在于如何将路由连接到操作方法、传统路由依赖的是名称字符串而不是特性来完成。
1.路由值
controller和action参数很特殊,应为它们映射到控制器和操作的名称,是必需参数但不是全部参数。
下面介绍一些匹配规则:
{controller}/{action}/{id} test/index/123
{controller}/{action}.html/{id} test/index.html/123 不能匹配: test/index/123
demo/{controller}/{action}/{id} demo/test/index/123 不能匹配: /test/index/123
还有比较灵活的路由语法规则:在路劲段中允许字面值和路由参数混合在一起,但不允许出现连续的路由参数。
{xx}-{yyy}/{controller}/{action}
{controller}.{action}.{id}
都是有效的路由,但是
{controller}{action}/{id} 不是有效的路由
路由以及匹配示例:
{actionller}/{action}/{genre} /test/list/index
service/{action}-{format} /service/display-xml
{report}/{year}/{month}/{day} /sales/2018/1/123
只需要记住,除非路由提供了controller和action 参数,否则MVC不知道为URL允许那些代码。
2.路由的默认值
3.路由约束
4.结合使用特性路由和传统路由
5.路由命名 在一个项目中每一个的路由名称请保持唯一,就算有区域在也需要保持唯一,避免二义性。
对于我们的多路由而言,我们需要把最难匹配的规则卸写在最上面,应为一个匹配到了下面就不会再进行匹配了。 多路由规则:由难到简
6.MVC区域
项目有多个功能,都可以创建MVC区域来管理。右键我们的项目,点击新增
每一个区域相当于一个小的MVC项目。它会有单独的控制器,视图等等
区域路由冲突: 如果存在相同名称的控制器,其中一个在区域中,另一个在应用的根目录下,就会抛出异常。
最佳解决办法:设置不一样的名字
网上一般给的解决办法是在路由中设置命名空间,设置的没有什么问题,它还是报错,路由名称不要起一样的名字(强制自己),也就是不要创建了一个区域去重命名
设置我设置之后,依旧会报错,自己去把名字改下吧。。。。。
DataTokens:
1.IgnoreRoute 忽略路由
创建了项目,在我们的RouteConfig 都会存在一句话
默认情况下,路由机制会忽略那些映射 到磁盘物理文件的请求,也就是(CSS,JPG,JS)的请求被路由忽略,ASP.NET的Web资源处理程序——WebResource.axd——的请求是一个HTTP处理程序来处理的,不需要我们的路由处理,我们可以将其忽略。