使用数据注释验证手动和对象图

时间:2011-08-04 09:17:34

标签: validation data-annotations manual

我们假设我有两个简单的类:

public class CustomerDetails
{
  [Required]
  public string Address
  {
    get;
    set;
  } 
}

public class Customer
{
   public Customer()
   {
     Details = new CustomerDetails();
   }

   [Required]
   public string Name
   {
     get;
     set;
   }
   public CustomerDetails Details
   {
     get;
     private set;
   } 
}

当我尝试以这种方式在控制台应用程序中手动验证Customer类时:

var customer = new Customer() { Name = "Conrad" };
var context = new ValidationContext(customer, null, null);
var results = new List<ValidationResult>();
Validator.TryValidateObject(customer, context, true);

然后 - 尽管我选择验证客户实例的所有属性 - Validator只验证客户实例的Name属性,但不验证Details的Address属性。

这是设计还是我错过了什么?此外,如果这是设计的,那么是否有一种强大的方法来手动验证用验证属性修饰的完整对象图,包括嵌套类型而不是手动使用整个对象图的验证器?

请注意,这是在控制台应用程序中测试的,而不是ASP.NET MVC应用程序。

亲切的问候。

1 个答案:

答案 0 :(得分:1)

我有几乎相同的问题,但有嵌套对象的集合。我能够通过在容器类上实现IValidatableObject来解决它。在你的情况下,它稍微容易一些。像这样:

public class Customer : IValidatableObject
{
    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
    {
        var context = new ValidationContext(this.Details, validationContext.ServiceContainer, validationContext.Items);
        var results = new List<ValidationResult>();
        Validator.TryValidateObject(this.Details, context, results);
        return results;
    }
}

希望这有帮助。