Validator.ValidateObject с «validateAllProperties» для истинной остановки при первой ошибке - PullRequest
13 голосов
/ 12 апреля 2011

У меня есть пользовательский класс (если быть проще):

using System;
using System.ComponentModel.DataAnnotations;

public class MyClass {
    [Required]
    public string Title { get; set;}
    [Required]
    public string Description { get; set;}
}

Я хочу проверить этот объект и получить исключение, если все не правильно.

Если я сделаю:

void Validate() {
    var objectToValidate = new MyClass { }; // Both properties are null at this time
    var ctx = new ValidationContext(objectToValidate, null, null);
    Validator.ValidateObject(objectToValidate, ctx, true);
}

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

если я немного поменяю код:

void Validate() {
    var objectToValidate = new MyClass { }; // Both properties are null at this time
    var ctx = new ValidationContext(objectToValidate, null, null);
    var errors = new List<ValidationResult>();
    var isValid = Validator.TryValidateObject(objectToValidate, ctx, errors, true);

    if(!isValid) {
        throw new AggregateException(
            errors.Select((e)=>new ValidationException(e.ErrorMessage)
        );
    }
}

У меня действительно могут быть все мои ошибки.

Почему первый фрагмент кода работает должным образом? Я сделал что-то не так?

ТНХ

1 Ответ

15 голосов
/ 12 апреля 2011

Validator.ValidateObject проходит через все атрибуты проверки и выдает ValidationException для первого, который завершился ошибкой. Я не думаю, что можно получить список всех свойств, которые потерпели неудачу таким образом.

Документация MSDN здесь немного запутанная, она гласит:

Метод ValidateObject оценивает каждый атрибут ValidationAttribute , связанный с типом объекта. Если validateAllProperties установлен в true, метод проверяет значения свойств объекта.

Продолжение руководства по методу TryValidateObject:

Также проверяется, предоставляется ли каждое свойство, помеченное с помощью RequiredAttribute.

Я подтверждаю, что он всегда проверяет все обязательные атрибуты, независимо от validateAllProperties. Но если у вас есть, например, атрибут проверки диапазона, он будет проверять его только тогда, когда validateAllProperties имеет значение true (потому что это когда проверяет значение свойства ). Немного сбивает с толку, но, как вы заметили, TryValidateObject показывает все ошибочные свойства, и это то, что я использую и для своего проекта.

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