Есть ли способ остановить проверку DataAnnotation после первого сбоя?

В моих ViewModels я использую несколько DataAnnotations для проверки данных формы, обычно есть 2-3 аннотации на поле.

Например, поле для адреса электронной почты может выглядеть так:

[Required(ErrorMessage = "Please enter an email address.")]
[Email(ErrorMessage = "That is not a valid email address.")] // Custom
public string Email { get; set; }

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

Если это невозможно, как это обычно делается? Должен ли я создавать собственные валидаторы для любого поля, которое имеет более одной аннотации? Будет ли это подходящим способом использовать аннотации, когда одна обрабатывает несколько типов проверки?

(Я также знаю, что, возможно, я мог бы объединить аннотацию Required в настраиваемую аннотацию Email, но это всего лишь пример).


person Brandon    schedule 20.02.2010    source источник


Ответы (3)


В этом конкретном случае я, вероятно, использовал бы тот же подход, что и валидаторы ASP.NET WebForms - просто чтобы валидатор EmailAttribute возвращал true, если значение равно null или пусто.

Подумай об этом:

  • Если адрес электронной почты требуется, тогда также будет [Required] валидатор, и пустой / пустой адрес электронной почты все равно вызовет ошибку проверки;

  • Если адрес электронной почты является необязательным, пустое значение должно считаться допустимым.

Нет необходимости решать сложную проблему перехвата валидаторов, когда вы можете просто разработать отдельные валидаторы, чтобы они хорошо играли вместе!

person Aaronaught    schedule 04.03.2010
comment
Спасибо за ответ. Думаю, вы правы, я мог бы изменить валидацию, чтобы они работали правильно, а в случаях, когда это невозможно, просто объедините их в одну. - person Brandon; 04.03.2010

Подтверждение заказа: No.

В этом случае вы можете просто удалить атрибут Required, потому что "" или "" не пройдут проверку адреса электронной почты.

И да, AFAIK создание настраиваемого атрибута проверки, который объединяет их оба, вероятно, ваш лучший выбор.

person John Farrell    schedule 20.02.2010

Проблема здесь в том, что порядок атрибутов полностью произвольный и определяется во время компиляции. Фактически вы можете установить простой порядок в зависимости от типа используемого средства проверки. Если вы используете что-то вроде xVal и средство проверки, подобное упомянутому здесь, вы можете добавить предложение orderby, подобное этому, для принудительной сортировки определенного типа атрибута вверх:

orderby attribute.GetType() == typeof(T) ? 0 : 1

Просто создайте строго типизированный метод запуска проверки, где T является производным от класса ValidationAttribute.

person Brandon Linton    schedule 04.03.2010