Вопрос проверки атрибута MVC3 - PullRequest
2 голосов
/ 28 июля 2011

Я получаю странное поведение с моей проверкой на мой взгляд.

У моей модели есть это свойство.

    [Display(Name = "Overflow Capacity")]
    [RegularExpression(@"[-+]?[0-9]*\.?[0-9]?[0-9]", ErrorMessage = "Number required.")]
    [Range(0,9999.99,ErrorMessage = "Value must be between 0 - 9,999.99")]
    public decimal OverFlowCapacity { get; set; }

У моего представления есть это:

<tr>
   <td>@Html.LabelFor(m=> m.OverFlowCapacity)</td>
   <td>@Html.EditorFor(m=>m.OverFlowCapacity)</td>                                               
   <td> @Html.ValidationMessageFor(model => model.OverFlowCapacity)</td>
</tr>

Если я введу значение, например 'ABC', я получу сообщение проверки«Требуется число» Если я введу значение 999999, я получу сообщение проверки «Значение должно быть в диапазоне от 0 до 9 999,99»

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

Однако, когда я отправляю сообщение, я получаю сообщение с подтверждением «Поле переполнения обязательно».

Я не знаю, откуда это происходит.Я попытался удалить все атрибуты проверки из модели, и все еще получаю сообщение «Требуется».Я в растерянности.

Вот сценарии, на которые я ссылался.

У меня есть другие проблемы с mvcfoolproof , которые я могу опубликовать позже.Мне интересно, если это не как-то отвечает за мои проблемы.

Ответы [ 3 ]

8 голосов
/ 28 июля 2011

То, что происходит с вами сейчас, заключается в том, что после отправки формы начинается проверка публикации и определяется, что значение decimal не может быть null.Прямо сейчас вы используете тип decimal, который не обнуляется.Если вам нужно такое поведение и вы хотите увидеть проверку перед отправкой формы, добавьте атрибут [Required] в свойство.Однако, если вы не хотите эту функцию и это может быть null, измените тип с decimal на decimal? или Nullable<decimal>.

Не разрешать пустые значения и иметь предварительную проверку:

[Display(Name = "Overflow Capacity")]
[RegularExpression(@"[-+]?[0-9]*\.?[0-9]?[0-9]", ErrorMessage = "Number required.")]
[Range(0,9999.99,ErrorMessage = "Value must be between 0 - 9,999.99")]
[Required]
public decimal OverFlowCapacity { get; set; }

Разрешить нулевые значения и избавиться от ошибки проверки после отправки:

[Display(Name = "Overflow Capacity")]
[RegularExpression(@"[-+]?[0-9]*\.?[0-9]?[0-9]", ErrorMessage = "Number required.")]
[Range(0,9999.99,ErrorMessage = "Value must be between 0 - 9,999.99")]
public decimal? OverFlowCapacity { get; set; }
1 голос
/ 28 июля 2011

Поскольку вы не помечаете свой десятичный тип как обнуляемый, MVC не знает, что делать с пустым полем, которое вы отправляете обратно. Попробуйте это, если хотите разрешить пустые / пустые поля:

public decimal? OverFlowCapacity { get; set; }

и попробуйте это, если вы хотите, чтобы оно получило сообщение проверки перед отправкой, требующее заполнения поля:

[Required]
public decimal OverFlowCapacity { get; set; }
0 голосов
/ 28 июля 2011

Ответы выше объясняют, что Требуемое сообщение об ошибке довольно хорошо, поэтому я просто сосредоточусь на втором сообщении об ошибке.то есть, если вы поставите 'abc', jquery сообщит вам "Number Required".Как JQuery знает, что этот вход должен принимать только числовые поля.Ответ;через ненавязчивые атрибуты, которые создаются с помощью полей формы.Если вы осмотрите поле ввода, вы найдете что-то вроде

<input name="OverFlowCapacity" id="OverFlowCapacity" data-val-number="Number Required"..../>

, поэтому, чтобы переопределить это сообщение проверки по умолчанию, вы должны украсить вашу модель атрибутом, который делает то же самое (проверка номера), и их можно переопределитьсообщение проверки

[Numeric(ErrorMessage="override message")]
[Required(ErrorMessage="override Required message")]
public decimal OverFlowCapacity{get;set;}

Я сомневаюсь, что числовой атрибут присутствует в DataAnnotation или инфраструктуре mvc.Вы должны проверить это.Обсуждаются и доступны некоторые полезные атрибуты здесь

...