关于模型验证那点事儿

今天应笑笑老师之问,做了一个模型验证的例子,发现之前对这个东西的理解太片面,重新整理了一下思路

字段验证优先级高于类验证

什么是类验证呢?就是两个字段组合的验证,比如你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();

附上测试结果

特别注意一点,这个类的模型验证是低于字段的模型验证的,所以字段验证不通过,这里是不触发的,切记

原文地址:https://www.cnblogs.com/NCoreCoder/p/9869971.html