今天應笑笑老師之問,做了一個模型驗證的例子,發現之前對這個東西的理解太片面,重新整理了一下思路
字段驗證優先級高于類驗證
什么是類驗證呢?就是兩個字段組合的驗證,比如你Admin不允許修改密碼,你修改密碼的Model在后端判斷字段是不是Admin,并且密碼的md5是不是特定的,我只是舉例子啊,這樣的驗證,優先級是低于字段的驗證的,字段驗證通過,才會觸發這個驗證
驗證的通用部分代碼抄襲自劉總
劉總博客園鏈接附上https://www.cnblogs.com/lwc1st/
public class ModelStateResult{public bool IsValid { get; }public List<ValidationResult> ValitionResultList { get; }public ModelStateResult(bool isValid, List<ValidationResult> valitionResultList){IsValid = isValid;ValitionResultList = valitionResultList;}}public static class ValitionExtension{public static ModelStateResult Valition<TEntity>(this TEntity entity) where TEntity:class,new(){var valitionResultList = new List<ValidationResult>();var context = new ValidationContext(entity, null, null);var isValidate = Validator.TryValidateObject(entity, context, valitionResultList, true);return new ModelStateResult(isValidate, valitionResultList);}}
我們先寫一個實體對象的常規驗證
public class UserInfo{[Required]public string User { get; set; }[StringLength(32, MinimumLength = 10)]public string Password { get; set; }public string PhoneNumber { get; set; }}
驗證部分代碼附上
UserInfo testEntity = new UserInfo(){User = null,Password = "123",PhoneNumber = "123456"};var testResult = testEntity.Valition();
我們看看執行結果
我們再添加一個,判斷是否Admin的驗證
public class UserInfoValidation{public static ValidationResult IsAdmin(object value, ValidationContext validationContext){if (value is UserInfo userInfo){if (userInfo.User.Equals("Admin")){var isValidate = userInfo.Password.Equals("12345678901");if (!isValidate){return new ValidationResult("User Is Admin, Password Check Error");}}}return ValidationResult.Success;}}
在實體對象上打上CustomValidation特性,會提示是兩個參數,第一個就是實現了自定義驗證的類的Type,第二個參數是方法名
完整的實體對象代碼為
[CustomValidation(typeof(UserInfoValidation), "IsAdmin")]public class UserInfo{[Required]public string User { get; set; }[StringLength(32, MinimumLength = 10)]public string Password { get; set; }public string PhoneNumber { get; set; }}
再寫一個測試代碼
var entity = new UserInfo(){User = "Admin",Password = "1234567890",PhoneNumber = "18382986022"};var validateResult = entity.Valition();
附上測試結果
特別注意一點,這個類的模型驗證是低于字段的模型驗證的,所以字段驗證不通過,這里是不觸發的,切記