.Net6基础功能封装分享12(统一参数校验)
文章标签:
jquery select设置选中
开发后台webapi接口,需要对接口传入的参数进行校验,如果传入的参数不符合验证规则,就直接返回参数错误,就需要封装统一参数校验过滤器;在.net6中,内置了DataAnnotations实现通过数据注解的方式对数据进行校验,提供了一些常用的数据注解,如必填、范围、邮箱、电话号码、长度、正则表达式等,也支持自定义校验规则,满足中小型项目的日常大部分的验证需求;如果项目中需要特别频繁和复杂严谨的数据校验需求,也可以集成第三方开源的FluentValidate库来使用。本文主要介绍DataAnnotations的实现方式;
首先编写参数校验过滤器ParamVerifyFilter,继承IAsyncActionFilter过滤器,重写OnActionExecutionAsync方法
public class ParamVerifyFilter : IAsyncActionFilter
{
public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
{
//校验不通过,直接返回参数错误的错误码,终止执行,校验通过执行后续逻辑
if (!context.ModelState.IsValid)
{
string errorMsg = context.ModelState.Keys.SelectMany(key =>
context.ModelState[key].Errors.Select(x => x.ErrorMessage)).FirstOrDefault();
var result = ResultUtil.Error(CodeMsg.PARAMETER_ERROR, errorMsg);
context.Result = new ContentResult
{
// 返回状态码设置为200,表示成功
StatusCode = StatusCodes.Status200OK,
// 设置返回格式
ContentType = "application/json;charset=utf-8",
Content = JsonConvert.SerializeObject(result)
};
await Task.CompletedTask;
}
else
{
await next();
}
}
}
将ParamVerifyFilter过滤器全局注册到服务中,关闭api的自动校验
webAppBuilder.Services.AddControllers(options =>
{
//添加全局路由前缀
string basePath = webAppBuilder.Configuration.GetValue<string>("BasePath");
options.Conventions.Insert(0, new RouteConvention(new RouteAttribute(#34;{basePath}/")));
//跨域过滤器
options.Filters.Add<CorsFilter>();
//控制器异常过滤器
options.Filters.Add<ExceptionFilter>();
//参数检验过滤器
options.Filters.Add<ParamVerifyFilter>();
});
//关闭自动校验
webAppBuilder.Services.Configure<ApiBehaviorOptions>(options => options.SuppressModelStateInvalidFilter = true);
在参数实体类中,添加校验规则数据注解
内置的验证特性有:
- [ValidateNever]:指示应将某一属性或参数排除在验证外。
- [CreditCard]:验证属性是否有信用卡格式。 需要 jQuery Validation 附加方法。
- [Compare]:验证模型中的两个属性是否匹配。
- [EmailAddress]:验证属性是否有电子邮件格式。
- [Phone]:验证属性是否有电话号码格式。
- [Range]:验证属性值是否在指定范围内。
- [RegularExpression]:验证属性值是否与指定的正则表达式匹配。
- [Required]:验证字段是否不为 null。 请参阅 [Required] 属性,获取关于该特性的行为的详细信息。
- [StringLength]:验证字符串属性值是否未超过指定长度限制。
- [Url]:验证属性是否有 URL 格式。