2012-04-24 4 views
0

В моей модели у меня есть особое поле, которое аннотированный следующим образом:Почему MVC 3 Validation перезаписывает мой?

[DataType(System.ComponentModel.DataAnnotations.DataType.Text)] 
    [RegularExpression("[0-9]{1,10}", ErrorMessage = "The stated Attempt Id is invalid!")] 
    public long? AttemptId { get; set; } 

Когда я вхожу неверные данные в попытке ID это дает мне следующее сообщение об ошибке в государстве Модель:

The value 'cbcbxcb' is not valid for AttemptId. 

У меня есть другое поле с похожими сообщениями об ошибке, но они имеют тип string вместо long? и правильное сообщение об ошибке отображается в тех случаях, когда задано недопустимое значение. Почему не сообщение для «длинного»? быть использованным? Я показываю свои ошибки, используя следующий литеральный тег на странице.

<%: Html.TValidationSummary() %> 

EDIT: Я попытался изменить проверки в модели следующее:

[Required(ErrorMessage="The stated Attempt Id is invalid!", AllowEmptyStrings=true)] 

Это, однако, по-прежнему неправильно. Во-первых, мне нужно разрешить пустое поле, и когда я это делаю, он дает мне «Заявленный идентификатор попытки недействителен!» сообщение об ошибке. Во-вторых, когда я ввожу неверные данные в поле, он возвращается к своему старому сообщению о плохих ошибках.

ответ

1

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

Если ваш параметр модели не является обязательным, вы можете выполнить проверку внутри контроллера и добавить свое собственное сообщение, используя метод ModelState.AddModelError - это немного взломать.

+0

Спасибо за ответ. теперь трюк заключается в том, что это конкретное поле не является действительно обязательным полем, поэтому пользователю следует разрешить пустую точку. Есть ли способ сделать то, что вы предлагаете, не привязывая его как «обязательное»? –

+0

Я изменил валидацию на «[Обязательно (ErrorMessage =« Заявленный идентификатор попытки недействителен! », AllowEmptyStrings = true)] ', и теперь он отображает сообщение об ошибке, если он оставлен пустым (что ему не нужно), и все еще показывает его неправильное error messag eif недействителен. –

+0

Редактировали, чтобы предоставить альтернативное решение, если ваш параметр необязателен – DaveRead

1

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

+0

Хорошо, есть ли способ, чтобы MVC использовал мое сообщение, когда это происходит? –

+0

не пробовал, вы можете попробовать этот подход из другого вопроса SO: http://stackoverflow.com/questions/9173034/override-datatype-mismatch-message-of-property-in-asp-net-mvcand-display -messag –

1

Вы должны использовать FluentValidation

Встроенные проверки материала с использованием атрибутов хрупко и противно - чтобы не сказать больше.

+0

Хотелось бы использовать что-то, что работает, к сожалению, это не личный проект и введение в систему стороннего программного обеспечения не является вариантом. Спасибо за предложение в любом случае. –

Смежные вопросы