• 第13章 URL 路由


    在引入MVC框架之前,ASP.NET假设在请求的URL与服务器硬盘上的文件之间有直接的关系。

    在MVC情况下,请求是由控制器类中的动作方法处理的。

    ----------------------------------------------------------

    注:路由系统没有任何控制器和动作的专门知识。它只是片段变量提取值,并把这些值沿着请求管道进行传递。在请求处理管道的

    后面部分,当请求恰好到达MVC框架时,其才会被赋给controller和action变量。

    注:默认情况下,路由系统在评估应用的路由之前,会考察一个URL是否匹配一个磁盘文件。

          当routes.RouteExistingFiles=true;  //对已存在的文件也进行路由,修改默认行为。

    注:controlleractionarea是MVC框架的保留变量,对应请求进行服务的控制器、动作方法、区域。

    ----------------------------------------------------------

    知识点:

      1.MvcRouteHandler类 是ASP.NET MVC应用程序定制路由的类。(new MvcRouteHandler())。

      2.MapRoute方法:专用于MVC应用程序。

      3.MapPageRoute方法:用于Asp.net Web Form应用程序。

          4.HttpRequestBase、HttpContextBase、HttpResponseBase 支撑支持路由系统的MVC体系结构。

    ----------------------------------------------------------

    一、路由系统的两个功能:

      1.考查一个输入URL,并推断出该请求想要的是哪个控制器动作方法Action。

      2.生成输出URL。这些URL是在视图渲染的HTML中出现的URL,以便用户点击链接时,调用特定的动作Action。

    二、URL模式的两个关键行为:

      1.保守的:只匹配与模式具有相同片段的URL。(注意:默认值会使〈=片段数的URL与模式匹配)

      2.宽松的:只要具有正确的片段数,该模式就会用来为片段变量提取值。(注意:路由顺序)

    三、默认值、静态URL片段、自定义片段变量、约束路由、对磁盘文件的请求进行路由

      1.默认值:当URL不包含与一个片段匹配的值时,便使用默认值。作为匿名类型的属性提供的。

           

    
    
    //此路由将匹配0个(使用2个默认值Home,Index)、1个(使用1个默认值Index)、2个片段的URL

    routes.MapRoute(
    "MyRoute",
                "{controller}/{action}",
                new{controller="Home",action="Index"}   //为controller变量提供了一个Home默认值,为action变量提供了一个Index的默认值。
                );

       2.使用静态URL片段:创建具有静态片段的模式,静态片段只做为URL中的片段,与controller、action无关。请求时,还是通过MvcRouteHandler实例与url参数中的变量进行匹配。当url参数变量中没有{controller}或{action}时,必须在默认值匿名类中进行赋值。

      3.自定义片段变量:

    routes.MapRoute(
    "MyRoute",
    "{controller}/{action}/{id}",
    new{controller="Home",action="Index",id=UrlParameter.Optional} //id=UrlParameter.Optional 定义了id为可选URL片段
    );

     

    public ActionResult CustomMethod(string id="DefaultId") //在参数列表中给出默认值,这个比较常用
    {
      ........
    
    }

       

        当没有提供可选择片段的值时,会调用系统的默认值(默认值可以路由规则中初始化,也可能在动作方法中初始化)。

    routes.MapRoute(
    "MyRoute",
    "{controller}/{action}/{id}",
    new{controller="Home",action="Index",id="DefaultId"} //id="DefaultId"为默认值,但是一般不建议这么做,一般在方法中初始化
    );

        可变长度路由:用"*catchall"片段变量来定义可变片段长度的支持。

    routes.MapRoute(
    "MyRoute",
    "{controller}/{action}/{id}/{*catchall}",//可变长度匹配
    new{controller="Home",action="Index",id=UrlParameter.Optional} //id=UrlParameter.Optional 定义了id为可选URL片段
    );

        上述配置可以匹配任意长度的路由(一般放在路由表的最下面),第四个片段及之后的片段集都是RouteData.Values["catchall"]的值。

       命名空间区分控制器优先顺序:当控制器名称重复时,需要使用命名空间来决定优先顺序。

    routes.MapRoute(
    "MyRoute",
    "{controller}/{action}/{id}/{*catchall}",//可变长度匹配
    new{controller="Home",action="Index",id=UrlParameter.Optional}, //id=UrlParameter.Optional 定义了id为可选URL片段
    new[]{"MyDemo.Controllers"} //优先调用的命名空间
    );

       注:优先命名空间不是按在路由表中出现的顺序进行优先的。

        只考察指定命名空间时,应将DataTokens["UseNamespaceFallback"]=false;

    Route myRoute=  routes.MapRoute(
    "MyRoute",
    "{controller}/{action}/{id}/{*catchall}",//可变长度匹配
    new{controller="Home",action="Index",id=UrlParameter.Optional}, //id=UrlParameter.Optional 定义了id为可选URL片段
    new[]{"MyDemo.Controllers"} //优先调用的命名空间
    );
    
    myRoute.DataTokens["UseNamespaceFallback"]=false;

        4.约束路由:正则表达式、指定值约束、HTTP方法约束、自定义约束

    routes.MapRoute(
    "MyRoute",
    "{controller}/{action}/{id}/{*catchall}",//可变长度匹配
    new{controller="Home",action="Index",id=UrlParameter.Optional}, //id=UrlParameter.Optional 定义了id为可选URL片段
    new{controller="^H.*",  //以H字母开头的URL
    action="^Index&|^about&", //action只能是Index 或 about
    httpMethod=new HttpMethodConstraint("GET") //只接收以get方法
    }
    new[]{"MyDemo.Controllers"} //优先调用的命名空间
    );

          自定义约束:通过实现IRouteConstraint接口

        5.对磁盘文件的请求进行路由:默认情况下,路由系统在评估应用程序的路由之前,会考察一个URL是否匹配一个磁盘文件。匹配就进行服务。

          为磁盘文件也进行路由:

    routes.MapRoute(
         "diskFile",
         "Content/aaa.html",
        new{
             controller="Home",action="Index"
              } 
    );   

          routes.IgnoreRoute("content/{filename}.html");   //阻止匹配content/{filename}.html 所有的html文件,被路由进行评估。直接返回磁盘文件。

               此方法是StopRoutingHandler类的一个实例,不是MvcRouteHanlder。当请求到IgnoreRoute 方法URL  模式得到匹配后,就不再进行后续路由表的匹配了。

        routes.IgnoreRoute方法遵循位置优先,所以放置的位置也同样重要。            

  • 相关阅读:
    [LeetCode] 88. Merge Sorted Array
    [LeetCode] 73. Set Matrix Zeroes
    [LeetCode] 70. Climbing Stairs(斐波那契数列)
    [LeetCode] 65. Valid Number(多个标志位)
    [LeetCode] 57.Insert Interval
    [CCF] 201612-2 工资计算
    手脱Aspack变形壳1
    手脱FSG v1.33
    手脱PEncrypt 4.0
    手脱JDPack
  • 原文地址:https://www.cnblogs.com/wjs5943283/p/4637517.html
Copyright © 2020-2023  润新知