Asp.Net Core 高級-模型驗證

模型狀態

1.模型狀態表示2個子系統的錯誤:模型綁定和模型驗證

模型綁定錯誤:數據類型不匹配

模型驗證:不符合業務規則

2.模型驗證使用ModelState.IsValid

3.使用[ApiController]則無需ModelState.IsValid,會直接返回HTTP 400

        public async Task<IActionResult> Text([FromBody]Student student)
        {
            if(!ModelState.IsValid)
            {
                return Ok("驗證錯誤");
            }

            return Ok(student);
        }

重新運行驗證

        public async Task<IActionResult> 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<ValidationResult> 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

客戶端驗證

下次再說

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章