ASP.NET Core中,通过定义路由模板,可以在Url上传递变量,同时可以针对变量提供默认值、可选和约束。
约束的使用方法是在属性路由上添加指定的约束名,用法如下:
// 单个使用 [Route("users/{id:int}")] public User GetUserById(int id) { } // 组合使用 [Route("users/{id:int:min(1)}")] public User GetUserById(int id) { }
框架内部已经提供了一些约束,如下所示:
约束
示例
匹配项示例
说明
 
int   
{id:int}   
123456789, -123456789   
匹配任何整数   
 
bool   
{active:bool}   
true, FALSE   
匹配 true或 false(区分大小写)   
 
datetime   
{dob:datetime}   
2016-12-31, 2016-12-31 7:32pm   
匹配有效的 DateTime 值(位于固定区域性中 - 查看警告)   
 
decimal   
{price:decimal}   
49.99, -1,000.01   
匹配有效的 decimal 值(位于固定区域性中 - 查看警告)   
 
double   
{weight:double}   
1.234, -1,001.01e8   
匹配有效的 double 值(位于固定区域性中 - 查看警告)   
 
float   
{weight:float}   
1.234, -1,001.01e8   
匹配有效的 float 值(位于固定区域性中 - 查看警告)   
 
guid   
{id:guid}   
CD2C1638-1638-72D5-1638-DEADBEEF1638, {CD2C1638-1638-72D5-1638-DEADBEEF1638}   
匹配有效的 Guid 值   
 
long   
{ticks:long}   
123456789, -123456789   
匹配有效的 long 值   
 
minlength(value)   
{username:minlength(4)}   
Rick   
字符串必须至少为 4 个字符   
 
maxlength(value)   
{filename:maxlength(8)}   
Richard   
字符串不得超过 8 个字符   
 
length(length)   
{filename:length(12)}   
somefile.txt   
字符串必须正好为 12 个字符   
 
length(min,max)   
{filename:length(8,16)}   
somefile.txt   
字符串必须至少为 8 个字符,且不得超过 16 个字符   
 
min(value)   
{age:min(18)}   
19   
整数值必须至少为 18   
 
max(value)   
{age:max(120)}   
91   
整数值不得超过 120   
 
range(min,max)   
{age:range(18,120)}   
91   
整数值必须至少为 18,且不得超过 120   
 
alpha   
{name:alpha}   
Rick   
字符串必须由一个或多个字母字符(a-z,区分大小写)组成   
 
regex(expression)   
{ssn:regex(^\d{{3}}-\d{{2}}-\d{{4}}$)}   
123-45-6789   
字符串必须匹配正则表达式(参见有关定义正则表达式的提示)   
 
required   
{name:required}   
Rick   
用于强制在 URL 生成过程中存在非参数值   
 
内置的约束能够适用于大部分常见的应用场景,但是有时候我们还是需要去自定义我们想要的效果。
自定义路由约束
自定义约束是要实现 IRouteConstraint 接口,然后重载 Match 方法,该方法有四个参数。
第一个参数 httpContext 是当前请求的上下文
第二个参数 route 是当前约束所属的路由
第三个参数 routeKey 是当前检查的变量名,例如文章开头示例中的 id 
第四个参数 values 是当前Url匹配的字典值,例如文章开头的示例的路由,如果Url是 users/1 ,那么就有一个字典,其 key = id , value = 1 。当然还有其他的变量的值,比如 controller , action 等。
第五个参数 routeDirection 是一个枚举值,代表是web请求的还是用 Url.Action 等方法生成Url。
举一个实例,我们想要定义一个约束,指定路由传过来的参数必须是指定的枚举值。
我们先定义一个枚举:
public enum BoolEnum { True, False }
然后定义约束:
