使用System.ComponentModel.DataAnnotations验证字段数据正确性

在.NET MVC 中,当页面提交model到Action的时候,自动填充ModelState。使用ModelState.IsValid进行方便快捷的数据验证,其验证也是调用命名空间System.ComponentModel.DataAnnotations中的各种方法进行验证。但是使用非MVC架构时,就需要写很多if判断或者正则表达式,当有多个字段需要验证的的时候不知道有多少人和我一样很厌烦这种用if判断的方式。这里记录一个方法,使用System.ComponentModel.DataAnnotations来实现自己的验证model抛出相应的错误信息。
C#文档地址:System.ComponentModel.DataAnnotations

这里我们先实现一个Person类,里面包含几个简单的属性,然后指定几个Attribute

        public class Person
    {
        [Required(ErrorMessage = "{0} 必须填写")]
        [DisplayName("姓名")]
        public string Name { get; set; }

        [Required(ErrorMessage = "{0} 必须填写")]
        [RegularExpression(@"[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}",ErrorMessage = "邮件格式不正确")]
        public string Email { get; set; }

        [Required(ErrorMessage = "{0} 必须填写")]
        [Range(1, 100,ErrorMessage = "超出范围")]
        public int Age { get; set; }

        [Required(ErrorMessage = "{0} 必须填写")]
        [StringLength(11, MinimumLength=11, ErrorMessage = "{0}输入长度不正确")]
        public string Phone { get; set; }

        [Required(ErrorMessage = "{0} 必须填写")]
        [Range(typeof(decimal),"1000.00","2000.99")]
        public decimal Salary { get; set; }
    }

然后实现一个ValidatetionHelper静态类,这里主要用到的是Validator.TryValidateObject方法。

 public static ValidResult IsValid(object value)
        {
            ValidResult result= new ValidResult();
            try
            {
                var validationContext = new ValidationContext(value);
                var results = new List<ValidationResult>();
                var isValid = Validator.TryValidateObject(value, validationContext, results, true);

                if (!isValid)
                {
                    result.IsVaild = false;
                    result.ErrorMembers = new List<ErrorMember>();
                    foreach (var item in results)
                    {
                        result.ErrorMembers.Add(new ErrorMember()
                        {
                            ErrorMessage = item.ErrorMessage,
                            ErrorMemberName = item.MemberNames.FirstOrDefault()
                        });
                    }
                }
                else
                {
                    result.IsVaild = true;
                }
            }
            catch (Exception ex)
            {
                result.IsVaild = false;
                result.ErrorMembers = new List<ErrorMember>();
                result.ErrorMembers.Add(new ErrorMember()
                {
                    ErrorMessage =ex.Message,
                    ErrorMemberName = "Internal error"
                });
            }

            return result;
        }

其中需要的返回结果类

    public class ValidResult
    {
        public List<ErrorMember> ErrorMembers { get; set; }
        public bool IsVaild { get; set; }
    }

    public class ErrorMember
    {
        public string ErrorMessage { get; set; }
        public string ErrorMemberName { get; set; }
    }

实现一个测试代码,这里看到对应验证数据比使用多个if简洁很多,整个代码也十分美观。

        static void Main(string[] args)
        {
            Person person = new Person();
            person.Name = "";
            person.Email = "121 212 K";
            person.Phone = "2345";
            person.Salary = 3000;
            var result =ValidatetionHelper.IsValid(person);
            if (!result.IsVaild)
            {
                foreach (ErrorMember errorMember in result.ErrorMembers)
                {
                    Console.WriteLine(errorMember.ErrorMemberName+":"+errorMember.ErrorMessage);
                }
            }
            Console.Read();
        }

通过测试,可以看到得到正确的验证结果。


测试结果

后续有时间,把DisplayName给显示上去,那就更完美了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Web MVC Spring Web MVC 是包含在 Spring 框架中的 Web 框架,建立于...
    Hsinwong阅读 22,668评论 1 92
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,314评论 19 139
  • 今天终于下定决心打算做一个开始,其实做这个2017年结束倒计时是源于最近的灵感,但是这个想要日更以共同勉励的想法却...
    蒙娜丽傻阅读 3,276评论 4 5
  • 可可读大班了,该长见识了,计划带他回湖北农村老家去看看。一直觉得让孩子回归大自然是孩子节假日最好的去处。...
    风中花絮儿阅读 4,282评论 2 4