路由约束
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 }
然后定义约束:
public class EnumConstraint : IRouteConstraint { private Type _enumType; public EnumConstraint(string enumTypeName) { _enumType = Type.GetType(enumTypeName); } public bool Match(HttpContext httpContext, IRouter route, string routeKey, RouteValueDictionary values, RouteDirection routeDirection) { var value = values[routeKey]; if (value == null) { return false; } if (Enum.TryParse(_enumType, value.ToString(), out object result)) { if (Enum.IsDefined(_enumType, result)) { return true; } } return false; } }
在 Startup.cs 的 ConfigureServices 方法添加自定义约束:
services.Configure<RouteOptions>(options => { options.ConstraintMap.Add("enum", typeof(EnumConstraint)); });
在路由上使用约束:
( WebApplicationTest 是当前的 namespace )
[Route("api/[controller]")] [ApiController] public class TestController : ControllerBase { // GET: api/Test [HttpGet("{bool:enum(" + nameof(WebApplicationTest) + "." + nameof(BoolEnum) + ")}")] public string Get(BoolEnum @bool) { return "bool: " + @bool; } [HttpGet("{id:int:min(2)}", Name = "Get")] public string Get(int id) { return "id: " + id; } [HttpGet("{name}")] public string Get(string name) { return "name: " + name; } }
{id:int:min(2)} 路由必须使用 min(2) ,否则对于 id = 0 或 id = 1 会有冲突。
运行程序,当路由是 api/Test/0 、 api/Test/1 、 api/Test/True 和 api/Test/False 的时候,匹配我们的自定义约束。
当路由是 api/Test/{大于2的整数} 的时候,匹配第二个路由。
其他情况匹配第三个路由。
结论
路由约束在某些场景下是非常有用的功能,可以减少 controller 中校验参数,将部分参数校验的功能使用声明式的 attruibute 来实现,某些重复的校验可以通过抽取成约束公共使用。
constraint 的构造函数可以使用注入,所以可以扩展性十分强,可以通过查询数据库做一些参数校验。
官网上对于路由约束只是简单的提了一下,本文对路由约束的使用提供了具体的示例。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
P70系列延期,华为新旗舰将在下月发布
3月20日消息,近期博主@数码闲聊站 透露,原定三月份发布的华为新旗舰P70系列延期发布,预计4月份上市。
而博主@定焦数码 爆料,华为的P70系列在定位上已经超过了Mate60,成为了重要的旗舰系列之一。它肩负着重返影像领域顶尖的使命。那么这次P70会带来哪些令人惊艳的创新呢?
根据目前爆料的消息来看,华为P70系列将推出三个版本,其中P70和P70 Pro采用了三角形的摄像头模组设计,而P70 Art则采用了与上一代P60 Art相似的不规则形状设计。这样的外观是否好看见仁见智,但辨识度绝对拉满。
更新日志
- 罗大佑-无法盗版的青春套装版10CD【WAV】
- 张学友《意乱情迷》蜚声环球 2024 [WAV+CUE][1G]
- 柏菲《好歌30年特别版2CD》最好听的影视歌曲[低速原抓WAV+CUE][1G]
- 张学友《世纪10星·永恒篇》香港版[WAV+CUE][1G]
- 模拟之声慢刻CD《刘德海.琵琶独奏精逊【低速原抓WAV+CUE】
- Jamettone-18052023—improv(EDit)(2024)【FLAC】
- 【索尼精芽20首最棒的苏格兰歌曲集【FLAC】
- 池约翰C.J《少年白马醉春风2 动画原声带》[320K/MP3][26.67MB]
- 池约翰C.J《少年白马醉春风2 动画原声带》[FLAC/分轨][144.13MB]
- 陈致逸《幻想乐园 Fantasyland》[320K/MP3][120.54MB]
- 席卷全球最红舞曲《火辣辣DJ[英文版]》[DTS-WAV]
- 群星-席卷全球最红舞曲《火辣辣DJ中文版》【WAV】
- 模拟之声慢刻CD《声入人心[年度发烧人声严选]》[低速原抓WAV+CUE]
- 陈致逸《幻想乐园 Fantasyland》[FLAC/分轨][554.27MB]
- Rhymist / LusciousBB《年轮》[320K/MP3][76.52MB]