使用属性进行验证

本文关键字:验证 属性 | 更新日期: 2023-09-27 18:12:33

我们有一个简单的类:

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

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

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

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

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

你知道怎么做吗?

谢谢!

编辑:与此同时,我决定不使用数据注释,而是使用http://fluentvalidation.codeplex.com,以便验证被移动到实体之外。通过这种方式,可以从实体和命令处理程序内部触发验证。由于使用了流畅的符号,验证本身看起来也更可读。

使用属性进行验证

下面是一个如何使用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);
        }
    }
}