ASP.NET MVC路由规则

路由约束

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?}")]   //访问HomeHome/Index

[Route("Admin/Create/{name}/{age=18}")]       //访问Admin/Create/xcAdmin/Create/xc/18

 

2. 路由前缀

我们可以通过设置[RoutePrefix]属性,为整个控制器设置一个共同的前缀。

[RoutePrefix("Admin")]           //访问Admin打头的控制器

 

3. 默认路由

我们也可以在一个Controller上去使用[Route],这个路由将被用在这个控制器所有的action上,除非一个指定的路由[Route]已经被用在一个action上(也就是重写了在这个Action的默认路由)。

[RoutePrefix("Admin")]

[Route("{action=Index}")]   

//访问 AdminAdmin/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)} 
{x:length(1,20)}

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属性路由

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值