• ASP.NET MVC5(一)—— URL路由


      1 using System;
      2 using System.Collections.Generic;
      3 using System.Linq;
      4 using System.Web;
      5 using System.Web.Mvc;
      6 using System.Web.Mvc.Routing.Constraints;
      7 using System.Web.Routing;
      8 
      9 namespace UrlAndRoutes
     10 {
     11     public class RouteConfig
     12     {
     13         public static void RegisterRoutes(RouteCollection routes)
     14         {
     15             routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
     16             //路由系统把url拆分成多个片段,如:/Home/Index 为两个片段,可以通过约束路由控制
     17             //路由顺序:一般情况下是以在RouteCollection对象中的出现顺序执行的,如果先匹配到路由,后面的将会不执行
     18             //URL模式的两个关键行为:保守的(Conservative),宽松的(Liberal)
     19             {
     20                 //这两种路由并不能对根目录进行解析
     21 
     22                 //添加路由的方式之一,新建一条路由并添加到routes中
     23                 Route route = new Route("{controller}/{action}", new MvcRouteHandler());
     24                 routes.Add("One", route);
     25 
     26                 //添加路由的方式之二,映射指定路由
     27                 routes.MapRoute("", "{controller}/{action}");
     28             }
     29             //定义默认值
     30             {
     31                 //只给动作定义默认值,有默认值的可以省略其片段,自动匹配默认值
     32                 routes.MapRoute("", "{controller}/{action}", new { action = "Index" });
     33                 //控制器于动作都定义默认值,这种定义可以识别根目录,自动匹配到默认值中,最多匹配两个片段
     34                 routes.MapRoute("", "{controller}/{action}", new { controller = "Home", action = "Index" });
     35             }
     36             //使用静态URL片段
     37             {
     38                 //使用静态字段,URL中第一个片段必须是固定的public(自定义)才能匹配到
     39                 routes.MapRoute("", "public/{controller}/{action}", new { controller = "Home", action = "Index" });
     40                 //混合片段URL模式,第一个片段必须以X开头,controller取自除X以外的部分
     41                 routes.MapRoute("", "X{controller}/{action}", new { controller = "Home", action = "Index" });
     42                 //静态字段混合片段结合,该url中不包含controller的可变片段,所以会使用默认值,
     43                 //这意味着对Shop控制器上的动作,都会被转换成对Home控制器的请求
     44                 routes.MapRoute("", "Shop/{action}", new { controller = "Home" });
     45             }
     46             //定义自定义片段变量
     47             {
     48                 //controller,action,area等是数据特殊变量名,所以在自定义片段变量中,不可以使用
     49                 //Id为自定义片段变量,在第三个片段的内容会被赋给Id,这条路由可以匹配0-3个片段的URL
     50                 routes.MapRoute("", "{controller}/{action}/{Id}", new { controller = "Home", action = "Index", Id = "default" });
     51                 //Id定义为可选参数,解析Url片段时,可选参数可以忽略,参数默认值一般在动作方法中设置
     52                 routes.MapRoute("", "{controller}/{action}/{Id}", new { controller = "Home", action = "Index", Id = UrlParameter.Optional });
     53                 //定义可边长路由,这是改变URL模式默认保守性的另一种方式
     54                 //用*号作为前缀,无论URL包含多少片段数,都将全部赋值给catcyall(自定义名称)
     55                 routes.MapRoute("", "{controller}/{action}/{Id}/{*catcyall}", new { controller = "Home", action = "Index", Id = UrlParameter.Optional });
     56 
     57                 //按照命名空间区分控制器的优先级顺序,在当有两个控制器相同的情况下时,如果不做设置,将会报错
     58                 //设置了命名空间后,遇到匹配的URL,则会优先寻找命名空间下的的控制器,找不到就会回归正常行为
     59                 //命名空间可以设置多个,但都属于同顺序级别,如果出现重复控制器名称,还是会报错
     60                 Route myRoute = routes.MapRoute("MyRoute", "{controller}/{action}/{Id}/{*catcyall}",
     61                     new { controller = "Home", action = "Index", Id = UrlParameter.Optional },
     62                     new[] { "命名空间名称" });
     63                 //此设置作用于在配置了命名空间优先级后,如果找不到该配置的命名空间,将禁止寻找其他命名空间的控制器
     64                 myRoute.DataTokens["UserNamespaceFallback"] = false;
     65             }
     66             //约束路由
     67             {
     68                 //使用正则表达式约束路由,"^H.*"匹配所有controller变量值以H开头的URL
     69                 routes.MapRoute("", "{controller}/{action}/{Id}/{*catcyall}",
     70                     new { controller = "Home", action = "Index", Id = UrlParameter.Optional },
     71                     new { controller = "^H.*" });
     72                 //将一条路由 约束到一组指定的值,设置该约束,action只能匹配片段值是Index或者About
     73                 routes.MapRoute("", "{controller}/{action}/{Id}/{*catcyall}",
     74                     new { controller = "Home", action = "Index", Id = UrlParameter.Optional },
     75                     new { controller = "^H.*", action = "^Index$|^About$" });
     76 
     77                 //使用Http方法约束路由,HttpMethodConstraint传参类型是params类型,httpMethod是自定义名称
     78                 routes.MapRoute("", "{controller}/{action}/{Id}/{*catcyall}",
     79                     new { controller = "Home", action = "Index", Id = UrlParameter.Optional },
     80                     new
     81                     {
     82                         controller = "^H.*",
     83                         action = "^Index$|^About$",
     84                         httpMethod = new HttpMethodConstraint("GET", "POST")
     85                     });
     86                 //使用类型和值约束,RangeRouteConstraint限制Id值为10-20之间,更多类型约束,可以参考命名空间:System.Web.Routing
     87                 //也可以自定义约束,需要实现IRouteConstraint接口
     88                 routes.MapRoute("", "{controller}/{action}/{Id}/{*catcyall}",
     89                     new { controller = "Home", action = "Index", Id = UrlParameter.Optional },
     90                     new
     91                     {
     92                         controller = "^H.*",
     93                         action = "^Index$|^About$",
     94                         httpMethod = new HttpMethodConstraint("GET", "POST"),
     95                         Id = new RangeRouteConstraint(10, 20)
     96                     });
     97             }
     98         }
     99     }
    100 }

    学习完精通Asp.Net MVC5的URL路由章节的总结代码

  • 相关阅读:
    Spark Mllib里的向量标签概念、构成(图文详解)
    Spark Mllib里的本地向量集(密集型数据集和稀疏型数据集概念、构成)(图文详解)
    Spark Mllib里的Mllib基本数据类型(图文详解)
    [转]Debugging into .NET Core源代码的两种方式
    [转]在ASP.NET Core使用Middleware模拟Custom Error Page功能
    [转]Asp.net MVC中的ViewData与ViewBag
    [转]细说 ASP.NET Cache 及其高级用法
    [转]分布式中使用Redis实现Session共享(二)
    [转]Asp.net Core 使用Redis存储Session
    [转]JS跨域解决方式 window.name
  • 原文地址:https://www.cnblogs.com/liuqiwang/p/9490260.html
Copyright © 2020-2023  润新知