.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

posted @   microsoft-zhcn  阅读(118)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示