使用属性验证

时间:2011-10-28 08:12:39

标签: c# asp.net-mvc-3 validation domain-driven-design data-annotations

我有,比方说,这个简单的课程:

public class User
{
  [Required(AllowEmptyStrings = false, ErrorMessage="EmailIsRequired"]
  public string EmailAddress { get; set; }
}

我知道如何在System.ComponentModel.DataAnnotations命名空间中使用Validator.TryValidateProperty和Validator.TryValidateObject。为了使其工作,您需要一个要验证的对象的实际实例。

但是现在,我想在没有User类实例的情况下验证某个值,例如:

TryValidateValue(typeof(User), "EmailAddress", "test@test.com");

目标是我想在实际实例化对象本身之前测试一个值(原因是我只允许创建有效的域实体)。所以实际上我想在类而不是实例上使用验证属性。

有什么想法可以做到吗?

谢谢!

编辑:同时我决定不使用数据注释,而是使用http://fluentvalidation.codeplex.com,以便验证移出实体之外。这样,可以从实体内部以及我的命令处理程序中触发验证。由于流利的符号,验证本身看起来更具可读性。

1 个答案:

答案 0 :(得分:17)

以下是您可以使用TryValidateValue方法的示例:

public class User
{
    [Required(AllowEmptyStrings = false, ErrorMessage = "EmailIsRequired")]
    public string EmailAddress { get; set; }
}

class Program
{
    static void Main()
    {
        var value = "test@test.com";

        var context = new ValidationContext(value, null, null);        
        var results = new List<ValidationResult>();
        var attributes = typeof(User)
            .GetProperty("EmailAddress")
            .GetCustomAttributes(false)
            .OfType<ValidationAttribute>()
            .ToArray();

        if (!Validator.TryValidateValue(value, context, results, attributes))
        {
            foreach (var result in results)
            {
                Console.WriteLine(result.ErrorMessage);
            }
        }
        else
        {
            Console.WriteLine("{0} is valid", value);
        }
    }
}