?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路由章节的总结代码
ASP.NET MVC5(一)—— URL路由
原文地址:https://www.cnblogs.com/liuqiwang/p/9490260.html