zoukankan      html  css  js  c++  java
  • 关于模型验证那点事儿

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

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

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

    附上测试结果

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

  • 相关阅读:
    Python3基础 str """ 多行字符串
    Python3基础 str *运算 重复拼接字符串
    Python3基础 time.localtime 当前系统的年月日 时分秒
    Python3基础 time 索引值访问元组中的年月日时分秒
    Python3基础 sys.path 查看搜索路径变量
    Python3基础 sys.path.append 增加模块的搜索路径
    C#中ListView的简单使用方法
    C#的注释和快速开启工具的命令
    sql server2008安装错误(无法处理异常)
    启动计算机总弹出页面配置问题
  • 原文地址:https://www.cnblogs.com/NCoreCoder/p/9869971.html
Copyright © 2011-2022 走看看