模型狀態
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
客戶端驗證
下次再說