4

假设我有两个简单的类:

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;
   } 
}

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

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 应用程序中测试的。

亲切的问候。

4

1 回答 1

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;
    }
}

希望这可以帮助。

于 2011-12-01T08:44:04.627 回答