zoukankan      html  css  js  c++  java
  • 路由

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

  • 相关阅读:
    如何用PostMan
    LINQ笔记-LINQ操作DataTable
    EF Core利用Transaction对数据进行回滚保护
    php 替换模板中的 PHP源码标签字符方法
    php读取文件使用redis的pipeline(管道)导入大批量数据
    Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境搭建教程
    php 版本升高后 会出现 之Deprecated: Function ereg_replace() is deprecated的解决方法
    IIS + FastCGI+php(从5.2升级到5.3)
    Nginx 出现 _STORAGE_WRITE_ERROR_:./Runtime/Cache/Home/
    nginx 环境不支持thinkPHP
  • 原文地址:https://www.cnblogs.com/Sea1ee/p/8735288.html
Copyright © 2011-2022 走看看