.NET7 自定义WebAPI模型验证
1、内置特性
[CreditCard]:验证属性是否具有信用卡格式。[Compare]:验证模型中的两个属性是否匹配。[EmailAddress]:验证属性是否具有电子邮件格式。[Phone]:验证属性是否具有电话号码格式。[Range]:验证属性值是否在指定的范围内。[RegularExpression]:验证属性值是否与指定的正则表达式匹配。[Required]:验证字段是否不为 null。 有关此属性的行为的详细信息。[StringLength]:验证字符串属性值是否不超过指定长度限制。[Url]:验证属性是否具有 URL 格式。[Remote]:通过在服务器上调用操作方法来验证客户端上的输入。
参考示例:
[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 配置如下:
//验证实体模型
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)自定义过滤器
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)禁用默认过滤器
builder.Services.Configure<ApiBehaviorOptions>(options =>
{
// 禁用默认模型验证过滤器
options.SuppressModelStateInvalidFilter = true;
});
(3)启用自定义过滤器
builder.Services.Configure<MvcOptions>(options =>
{
// 全局添加自定义模型验证过滤器
options.Filters.Add<DataValidationFilter>();
});
参考:https://blog.51cto.com/u_15127647/4262299

浙公网安备 33010602011771号