路由约束
1. 用正则表达式约束路由
controller = "^H.*"
上述正则表达式形成了一个约束,它只匹配控制器以“H”打头的URL
action = "^Index$|^About$"
上述正则表达式形成了一个约束,它只匹配行为方法名称为“Index”或“About”的URL
2. 约束类型和值
id = new RangeRouteConstraint(10,20)
上述限制了id的值在10-20之间,还有更多的约束类,如下所示:
名称 | 描述 | 属性约束 |
AlphaRouteConstraint() | 匹配字母字符,主要是(A-Z,a-z) | Alpha |
BoolRouteConstraint() | 匹配一个可以解析成bool类型的值 | Bool |
DateTimeRouteConstraint() | 匹配一个可以解析成DateTime类型的值 | DateTime |
DecimalRouteConstraint() | 匹配一个可以解析成Decimal类型的值 | Decimal |
DoubleRouteConstraint() | 匹配一个可以解析成Double类型的值 | Double |
FloatRouteConstraint() | 匹配一个可以解析成Float类型的值 | Float |
IntRouteConstraint() | 匹配一个可以解析成Int类型的值 | Int |
LengthRouteConstraint(len) LengthRouteConstraint(min,max) | 匹配一个指定字符个数的值,或匹配字符个数在min和max之间的值 | Length(len) Length(min,max) |
LongRouteConstraint() | 匹配一个可以解析成Long类型的值 | Long |
MaxRouteConstraint(val) | 匹配一个小于val的值 | Max(val) |
MaxLengthRouteConstraint(val) | 匹配一个字符长度小于val的值 | MaxLength(val) |
MinRouteConstraint(val) | 匹配一个大于val的值 | Min(val) |
MinLengthRouteConstraint(val) | 匹配一个字符长度大于val的值 | MinLength(val) |
RangeRouteConstraint(min,max) | 匹配一个值在min和max之间的值 | Range(min,max) |
我们可以使用CompoundRouteConstraint接收多个约束的组合。
属性路由
在属性路由中,路由是在控制器的类的C#属性定义的,但是属性路由扰乱了应用程序中控制器和路由配置两个部分,致使关注点合并在一起了。
要使用属性路由,我们首先要在RouteConfig类中的调用
routes.MapMvcAttributeRoutes();
1.可选URL参数和默认值
你可以通过增加一个 "?" 标记到路由参数上去使用一个可选的URI参数。可以通过 parameter=value指定一个默认的值
[Route("Home/{Index?}")] //访问Home或Home/Index
[Route("Admin/Create/{name}/{age=18}")] //访问Admin/Create/xc或Admin/Create/xc/18
2. 路由前缀
我们可以通过设置[RoutePrefix]属性,为整个控制器设置一个共同的前缀。
[RoutePrefix("Admin")] //访问Admin打头的控制器
3. 默认路由
我们也可以在一个Controller上去使用[Route],这个路由将被用在这个控制器所有的action上,除非一个指定的路由[Route]已经被用在一个action上(也就是重写了在这个Action的默认路由)。
[RoutePrefix("Admin")]
[Route("{action=Index}")]
//访问 Admin或Admin/Index,这个控制器下其他没有定义路由的动作方法通过方法名称访问。
4. 路由约束
路由约束可以让我们去限制怎样去匹配路由参数,例如
[Route("Create/{name:alpha}")] //限制name必须是字母
具体的限制列表如下:
Constraint | Description | Example |
alpha | Matches uppercase or lowercase Latin alphabet characters (a-z, A-Z) | {x:alpha} |
bool | Matches a Boolean value. | {x:bool} |
datetime | Matches a DateTime value. | {x:datetime} |
decimal | Matches a decimal value. | {x:decimal} |
double | Matches a 64-bit floating-point value. | {x:double} |
float | Matches a 32-bit floating-point value. | {x:float} |
guid | Matches a GUID value. | {x:guid} |
int | Matches a 32-bit integer value. | {x:int} |
length | Matches a string with the specified length or within a specified range of lengths. | {x:length(6)} |
long | Matches a 64-bit integer value. | {x:long} |
max | Matches an integer with a maximum value. | {x:max(10)} |
maxlength | Matches a string with a maximum length. | {x:maxlength(10)} |
min | Matches an integer with a minimum value. | {x:min(10)} |
minlength | Matches a string with a minimum length. | {x:minlength(10)} |
range | Matches an integer within a range of values. | {x:range(10,50)} |
regex | Matches a regular expression. | {x:regex(^\d{3}-\d{3}-\d{4}$)} |
5. Areas
我们可以使用RouteArea属性,去让控制器属于一个Area。
如果我们在同时使用用Areas和属性路由,Areas的路由基于我们在AreaRegistration中设置的,你需要去确保在配置中Area注册是在MVC 属性路由注册之后,对于这两种配置,我们都应该在 默认路由之前去注册。原因我想我不用说都应该很清楚吧,哪一个先去注册,那一个路由配置就最先去匹配URI,匹配不成功再交给下一个路由配置
routes.MapMvcAttributeRoutes();
AreaRegistration.RegisterAllAreas();
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
以上内容部分来自《精通ASP.NET MVC》和ASP.NET MVC属性路由