Рекурсивная проверка с использованием аннотаций и IValidatableObject - PullRequest
9 голосов
/ 18 декабря 2011

Я пытаюсь проверить вложенные объекты (не модели в MVC senss), используя аннотации и некоторый пользовательский код.

Я нашел следующий пост полезным

Использование проверки аннотаций данныхВручную и графы объектов

Как было предложено в ответе, я создал дополнительную подпрограмму в классе контейнера для проверки правильности вложенного объекта.Вот мой модифицированный тестовый код

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

    [Required]
    [MaxLength(2)]
    public string Name
    {
        get;
        set;
    }

    public CustomerDetails Details
    {
        get;
        private set;
    }

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

Однако у меня возникают проблемы с получением all ошибок проверки, даже при вызове TryValidateObject с validateAllProperties, установленным в true.

        var context = new ValidationContext(cs, null, null);
        var results = new List<ValidationResult>();
        Validator.TryValidateObject(cs, context, results,true);

Если в контейнере есть какие-либо ошибки, будут отображаться только они.Только когда в объекте контейнера нет ошибок, будут отображаться ошибки во вложенном объекте.Я подозреваю, что это как-то связано с процедурой Validate, которая возвращает полный список, и не может быть добавлена ​​в (существующий) список из контейнера (?)

Есть ли какие-либо изменения, которые я могу внести в подпрограммуполучить все ошибки, чтобы показать?

1 Ответ

5 голосов
/ 18 декабря 2011

См. Этот ответ: https://stackoverflow.com/a/3400627/724944

Итак, в атрибутах вашего класса произошла ошибка, и поэтому метод Validate не вызывается.Я предлагаю использовать CustomValidationAttribute , например:

[CustomValidation(typeof(Customer), "ValidateRelatedObject")]
public CustomerDetails Details
{
    get;
    private set;
}

public static ValidationResult ValidateRelatedObject(object value, ValidationContext context)
{
    var context = new ValidationContext(value, validationContext.ServiceContainer, validationContext.Items);
    var results = new List<ValidationResult>();
    Validator.TryValidateObject(value, context, results);

    // TODO: Wrap or parse multiple ValidationResult's into one ValidationResult

    return result;

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...