Asp.Net Core 高级-模型验证

模型状态

1.模型状态表示2个子系统的错误:模型绑定和模型验证

模型绑定错误:数据类型不匹配

模型验证:不符合业务规则

2.模型验证使用ModelState.IsValid

3.使用[ApiController]则无需ModelState.IsValid,会直接返回HTTP 400

        public async Task Text([FromBody]Student student)
        {
            if(!ModelState.IsValid)
            {
                return Ok("验证错误");
            }

            return Ok(student);
        }

重新运行验证

        public async Task Text([FromBody]Student student)
        {
            if(!ModelState.IsValid)
            {
                return Ok("验证错误");
            }

            student.Age = 6;
            if (!TryValidateModel(student))
            {
                return Ok("又错啦");
            }

            return Ok(student);
        }

验证特性

[Required]
[Range(1,5)]
。。。

内置特性

System.ComponentModel.DataAnnotations

错误消息

1.重新制定错误的消息

[Required(ErrorMessage ="name是必须的")]

2.可以用占位符来动态制定内容

[Required(ErrorMessage ="{0}是必须的")]

如果有其他数字或字符串制定,可以为{1},{2}


[Required]特性

1.可以指定值类型为空时默认的错误消息

            services.AddControllers(options=>
            {
                options.ModelBindingMessageProvider.SetValueMustNotBeNullAccessor((_) =>
                {
                    return "the field is required !!!";
                });
            });

2.将值类型设置为可空类型


[Remote]特性

可以远程验证,直接在客户端上用JavaScript自己调用服务器验证


自定义特性

    public class CustomAttribute : ValidationAttribute
    {
        int _num;
        //指定时需要有参数
        public CustomAttribute(int num)
        {
            _num = num;
        }

        protected override ValidationResult IsValid
            (object value, ValidationContext validationContext)
        {
            //获取实例
            var student = (Student)validationContext.ObjectInstance;
            //获取被校验的值
            var dit = (int)value;
            if(dit > _num)
            {
                return new ValidationResult("年龄太大了");
            }
            return ValidationResult.Success;
        }
    }

调用

        [Custom(5)]
        public int Age { get; set; }

IValidatableObject

    public class CustomValidatable : IValidatableObject
    {
        public int Age { get; set; }
        public string Name { get; set; }

        public IEnumerable Validate(ValidationContext validationContext)
        {
            if (Age > 5)
                yield return new ValidationResult("年龄太大了");
        }
    }

顶级节点验证

1.顶级节点就是针对方法参数中的int,string等简单类型,而非复杂类型

2.顶级节点验证直接在参数前面加上属性

3.使用正则

[RegularExpression(@"^\d{3}$")]string name

4.[Required],[BindRequired]

[Required]:参数里面必须是key=value的样式,表示key不能为null

[BindRequired]:参数里面只要出现key就可以了,表示需要将key绑定,其值可以为null


最大错误数

options.MaxModelValidationErrors = 100;

最大递归次数

当属性无限引用其他类时,模型验证会导致堆栈溢出。

设置最大校验的递归次数

MaxValidationDepth

客户端验证

下次再说

你可能感兴趣的:(asp.net,core,c#)