使用数据注解在实体级别进行数据验证
一个在实体级别使用数据注解进行数据验证的简单框架。
引言
本文介绍如何使用数据注解在实体上创建一个简单的数据验证框架。
背景
暂时抛开业务规则验证,有没有想过如何借助数据注解在实体级别进行数据验证? 这里有一个简单的框架来实现我们现在所想的 ;-)
使用代码
让我们将整个概念分解为五个小部分
- 创建一个通用的实体类,并在所有希望进行数据验证的类中继承它。
- 创建一个
EntityValidation
类,执行实际的验证 - 创建一个
EntityValidator
类,作为使用此框架的入口点(反过来使用EntityValidation
)。 - 在
Entity
类(在步骤 1 中创建的)中使用此框架 - 现在开始在所有从
Entity
派生的实体中使用此框架
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; }
}
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;
}
}
public class EntityValidator
{
public static IEnumerable<ValidationResult> ValidateEntity<T>(T entity) where T:Entity
{
return new EntityValidation<T>().Validate(entity);
}
}
public abstract class Entity
{
[Required]
public virtual int Key { get; set; }
public virtual IEnumerable<ValidationResult> Validate()
{
return EntityValidator.ValidateEntity(this);
}
}
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。
(这是我第一篇技术文章。请发表您的评论以帮助我进一步改进。)