ASP.NET Core中自定义路由约束的实现

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 }

然后定义约束:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wdsgxx.html