路由

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处理程序来处理的,不需要我们的路由处理,我们可以将其忽略。

 

posted @ 2018-09-26 23:23  Sealee  阅读(246)  评论(0编辑  收藏  举报