Почему IValidatableObject.Validate только вызывается, если проверка свойств проходит?

В моей модели кажется, что Validate() вызывается только после того, как оба свойства проходят проверку.

public class MyModel : IValidatableObject 
{
    [Required]
    public string Name { get; set;}

    [Required]
    public string Nicknames {get; set;}

    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
    {
        if(Nicknames != null && Nicknames.Split(Environment.NewLine.ToCharArray()).Count() < 2)
            return yield result new ValidationResult("Enter at least two nicknames, new [] { "Nicknames" });
    }
}

Когда пользователь вводит одну строку текста в текстовую область Nicknames, но оставляет текстовое поле Name пустым, отображается только сообщение об ошибке Required для свойства Name. Сообщение об ошибке, которое должно отображаться из функции Validate(), никогда не появляется.

Только после ввода имени в текстовое поле Name, а текст в тексте Nicknames - это функция Validate().

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

Ответ 1

Это по дизайну. Проверка уровня объекта не срабатывает, пока все свойства не пройдут проверку, поскольку в противном случае возможно, что объект является неполным. Метод Validate предназначен для сравнения, сравнивая одно свойство с другим. В вашем случае вы должны написать специальный валидатор свойств.