.NET7 自定义WebAPI模型验证
1、内置特性
[CreditCard]
:验证属性是否具有信用卡格式。[Compare]
:验证模型中的两个属性是否匹配。[EmailAddress]
:验证属性是否具有电子邮件格式。[Phone]
:验证属性是否具有电话号码格式。[Range]
:验证属性值是否在指定的范围内。[RegularExpression]
:验证属性值是否与指定的正则表达式匹配。[Required]
:验证字段是否不为 null。 有关此属性的行为的详细信息。[StringLength]
:验证字符串属性值是否不超过指定长度限制。[Url]
:验证属性是否具有 URL 格式。[Remote]
:通过在服务器上调用操作方法来验证客户端上的输入。
参考示例:
1 2 3 4 5 6 7 8 | [Required(ErrorMessage = "姓名不能为空" )] public string Name { get ; set ; } [Range(1, 100, ErrorMessage = "年龄限制是大于1,小于100" )] public int Age { get ; set ; } [RegularExpression( "^[1]+[3,4,5,7,8]+\\d{9}" , ErrorMessage = "电话号码格式不合法" )] public string PhoneNum { get ; set ; } |
参考网址:https://www.cnblogs.com/kissdodog/archive/2013/05/04/3060278.html
2、模型认证
Program.cs 配置如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | //验证实体模型 builder.Services.Configure<ApiBehaviorOptions>(options => { //解除默认设置 options.SuppressModelStateInvalidFilter = true ; options.InvalidModelStateResponseFactory = actionContext => { //获取验证失败的模型字段 var errors = actionContext.ModelState .Where(s => s.Value != null && s.Value.ValidationState == ModelValidationState.Invalid) .SelectMany(s => s.Value!.Errors.ToList()) .Select(e => e.ErrorMessage) .ToList(); //统一返回格式 var result = ResponseMessage.Error( string .Join( "," , errors), StatusCodes.Status400BadRequest); return new BadRequestObjectResult(result); }; }); |
方案2:自定义过滤器
(1)自定义过滤器
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | public class DataValidationFilter : IActionFilter { public void OnActionExecuting(ActionExecutingContext context) { // 如果其他过滤器已经设置了结果,则跳过验证 if (context.Result != null ) return ; // 如果验证通过,跳过后面的动作 if (context.ModelState.IsValid) return ; // 获取失败的验证信息列表 var errors = context.ModelState .Where(s => s.Value != null && s.Value.ValidationState == ModelValidationState.Invalid) .SelectMany(s => s.Value!.Errors.ToList()) .Select(e => e.ErrorMessage) .ToArray(); // 统一返回格式 var result = new ApiResult() { Code = StatusCodes.Status400BadRequest, Msg = "数据验证不通过!" , Data = errors }; // 设置结果 context.Result = new BadRequestObjectResult(result); } public void OnActionExecuted(ActionExecutedContext context) { } } |
(2)禁用默认过滤器
1 2 3 4 5 | builder.Services.Configure<ApiBehaviorOptions>(options => { // 禁用默认模型验证过滤器 options.SuppressModelStateInvalidFilter = true ; }); |
(3)启用自定义过滤器
1 2 3 4 5 | builder.Services.Configure<MvcOptions>(options => { // 全局添加自定义模型验证过滤器 options.Filters.Add<DataValidationFilter>(); }); |
参考:https://blog.51cto.com/u_15127647/4262299
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?