Использование проверки аннотаций данных вручную и графов объектов - PullRequest
3 голосов
/ 04 августа 2011

Давайте предположим, что у меня есть два простых класса:

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 экземпляра клиента, но не свойство Address в Details.

Это по замыслу или я что-то здесь упускаю? Кроме того, если это предусмотрено проектом, то существует ли надежный способ ручной проверки полного графа объекта, украшенного атрибутами валидации, включая вложенные типы, вместо использования валидатора для всего графа объекта вручную?

Обратите внимание, что это тестируется в консольном приложении, а не в приложении ASP.NET MVC.

С уважением.

1 Ответ

1 голос
/ 01 декабря 2011

У меня была почти такая же проблема, но с коллекцией вложенных объектов. Я смог решить ее, реализовав 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;
    }
}

Надеюсь, это поможет.

...