65.9K
CodeProject 正在变化。 阅读更多。
Home

使用数据注解在实体级别进行数据验证

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.86/5 (10投票s)

2013年11月10日

CPOL
viewsIcon

35217

一个在实体级别使用数据注解进行数据验证的简单框架。

引言

本文介绍如何使用数据注解在实体上创建一个简单的数据验证框架。

背景

暂时抛开业务规则验证,有没有想过如何借助数据注解在实体级别进行数据验证? 这里有一个简单的框架来实现我们现在所想的 ;-)

使用代码

让我们将整个概念分解为五个小部分

  1. 创建一个通用的实体类,并在所有希望进行数据验证的类中继承它。
  2. public abstract class Entity
    {
    	[Required]
        public virtual int Key { get; set; }
    }
    
    public class UserAccount : Entity
    {
        [Required]
        [StringLength(200)]
        [EmailAddress]
        public virtual string Email { get; set; }
    
        [Required]
        [StringLength(2)]
        public virtual string FirstName { get; set; }
    
        [Required]
        [StringLength(2)]
        public virtual string LastName { get; set; }
    
        [StringLength(20)]
        [RegularExpression(@"^\(?([0-9]{3})\)?[-. ]?([0-9]{3})[-. ]?([0-9]{4})$",
            ErrorMessage = "Personal phone format is not valid.")]
        public virtual string PersonalPhone { get; set; }
    }
  3. 创建一个 EntityValidation 类,执行实际的验证
  4. public class EntityValidation<T> where T : Entity
    {
        public IEnumerable<ValidationResult> Validate(T entity)
        {
            var validationResults = new List<ValidationResult>();
            var validationContext = new ValidationContext(entity, null, null);
            Validator.TryValidateObject(entity,validationContext, validationResults, true);
            return validationResults;
        }
    }
  5. 创建一个 EntityValidator 类,作为使用此框架的入口点(反过来使用 EntityValidation)。
  6. public class EntityValidator
    {
        public static IEnumerable<ValidationResult> ValidateEntity<T>(T entity) where T:Entity
        {
            return new EntityValidation<T>().Validate(entity);
        }
    } 
  7. Entity 类(在步骤 1 中创建的)中使用此框架
  8. public abstract class Entity
    {
    	[Required]
        public virtual int Key { get; set; }
     	public virtual IEnumerable<ValidationResult> Validate()
        {
            return EntityValidator.ValidateEntity(this);
        }
    }
  9. 现在开始在所有从 Entity 派生的实体中使用此框架
  10. class Program
    {
        static void Main(string[] args)
        {
            var student = new UserAccount() 
            { Email = "sasa.@gmai.com", FirstName = "fn123", 
              LastName = "ln123", PersonalPhone = "1234" };
            foreach (var error in student.Validate())
            {
                Console.WriteLine(error.ErrorMessage);
            }           
        }
    } 

错误会显示如下

errors = Count = 4
[0] = {The Email field is not a valid e-mail address.}
[1] = {The field FirstName must be a string with a maximum length of 2.}
[2] = {The field LastName must be a string with a maximum length of 2.}
[3] = {Personal phone format is not valid.}

关注点

如果您想了解更多关于数据注解的信息,请参考以下 MSDN 链接: http://msdn.microsoft.com/en-us/library/system.componentmodel.dataannotations.aspx

(这是我第一篇技术文章。请发表您的评论以帮助我进一步改进。)

© . All rights reserved.