.net5 .net6 WebAPI 参数验证 模型验证 ModelValid 接口参数校验 统一返回结构

.net5

利用InvalidModelStateResponseFactory
官网推荐做法 覆盖ModelState管理的默认行为,只有在数据验证失败时才会执行

services.Configure<ApiBehaviorOptions>(options =>
{
  options.InvalidModelStateResponseFactory = (context) =>
  {
      //参数验证
            services.Configure<ApiBehaviorOptions>(options =>
            {
                //只有在数据验证失败时才会执行
                options.InvalidModelStateResponseFactory = (context) =>
                {
                    var errors = context.ModelState.Select(f => new KeyValuePair<string, IEnumerable<string>>(f.Key, f.Value.Errors.Select(e => e.ErrorMessage)));

                    return new JsonResult(new APIResponseModel<object> { Code = ResponseEnum.FAIL.GetHashCode(), Message = JsonConvert.SerializeObject(errors), Data = errors });
                };
            });  

  };
});

.net6

builder.Services.Configure<ApiBehaviorOptions>(options =>
            {
                options.InvalidModelStateResponseFactory = (context) =>
                {
                    //只有在数据验证失败时才会执行

                    //一次性返回所有的报错
                    //var errors = context.ModelState.Select(f => new KeyValuePair<string, IEnumerable<string>>(f.Key, f.Value.Errors.Select(e => e.ErrorMessage)));
                    //return new JsonResult(new APIResponseModel<object> { Code = ResponseEnum.Fail.GetHashCode(), Message = JsonConvert.SerializeObject(errors), Data = errors });

                    //返回第一条报错
                    var error = context.ModelState.Values.FirstOrDefault(f => f.ValidationState != Microsoft.AspNetCore.Mvc.ModelBinding.ModelValidationState.Valid);//.Select(f => new KeyValuePair<string, IEnumerable<string>>(f.Key, f.Value.Errors.Select(e => e.ErrorMessage)));
                    if (error != null && error.Errors != null && error.Errors.Count > 0)
                    {
                        var errMsg = error.Errors.First().ErrorMessage;
                        return new JsonResult(new APIResponseModel<object> { Code = ResponseEnum.Fail.GetHashCode(), Message = errMsg });
                    }

                    return new JsonResult(new APIResponseModel<object> { Code = ResponseEnum.Fail.GetHashCode(), Message = "ModelError", Data = context.ModelState.Values });

                };
            });

自定义验证

public class NoSpaceAttribute : ValidationAttribute
    {
        public override bool IsValid(object value)
        {
            if (value is string str)
            {
                return !str.Contains(' ');
            }
            return false;
        }
    }

常用过滤器

说明
AssociationAttribute 指定某个实体成员表示某种数据关系,如外键关系。
ConcurrencyCheckAttribute 指定某属性将参与开放式并发检查。
CustomValidationAttribute 指定要执行的自定义方法以验证实体成员。
DataTypeAttribute 指定要与实体成员关联的附加类型的名称。
DisplayAttribute 为在用户界面中使用的实体类型和成员指定可本地化的字符串。
DisplayColumnAttribute 指定在将表用作外键关系中的父表时要显示的属性、用于排序的属性以及排序顺序。
DisplayFormatAttribute 指定如何显示数据字段以及如何设置数据字段的格式。
EditableAttribute 指定用户是否应能够更改实体属性的值。
EnumDataTypeAttribute 指定某个实体成员对应于某个枚举类型。
FilterUIHintAttribute 指定列的筛选行为。
KeyAttribute 指定一个或多个要用作实体的唯一标识的实体属性。
RangeAttribute 为关联成员指定最小值和最大值约束。
RegularExpressionAttribute 指定用于验证关联成员的正则表达式。
RequiredAttribute 指定必须为属性提供值。
StringLengthAttribute 指定一个实体成员允许的最大字符数和最小字符数。
TimestampAttribute 将某个成员指定为时间戳值。
UIHintAttribute 指定用于显示关联实体成员的控件和值。
ValidationAttribute 作为所有验证属性的基类。
ValidationContext 提供有关要验证的类型或成员的信息。
ValidationException 表示在验证使用某个验证属性标记的成员期间出现的异常。
ValidationResult 包含验证请求的结果。
Validator 提供成员以帮助使用关联 ValidationAttribute 属性的值验证对象和成员。

参考

posted @   Hey,Coder!  阅读(281)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示