У меня есть следующее свойство в моей модели:
[Required]
[Range(1, int.MaxValue, ErrorMessage = "Bad number")]
public virtual int Number { get; set; }
Я заполняю его в контроллере:
List<SelectListItem> items = new List<SelectListItem>();
// numbers is just a list with entities with an integer field Number
items.AddRange(numbers.
Select(n => new SelectListItem() { Text = n.Number.ToString(), Value = n.Number.ToString() })
.ToArray());
ViewBag.Numbers = items;
И на мой взгляд у меня есть следующее:
@Html.DropDownListFor(m => m.Number, ViewBag.Numbers as IEnumerable<SelectListItem>, "Select a number")
@Html.ValidationMessageFor(m => m.Number)
Кажется, он работает нормально, если включен Javascript - когда я выбираю первый элемент (пустой «Выберите число»), срабатывает обязательный валидатор и не разрешает отправку.
Но когда я отключаю Javascript, я получаю исключение прямо в этом вызове метода DropDownListFor:
The ViewData item that has the key 'Number' is of type 'System.Int32' but must be of type 'IEnumerable<SelectListItem>'.
Когда я комментирую [Диапазон], такого исключения нет, но тогда кажется, что Required не работает - я могу отправить пустую опцию «Выбрать число» (которая имеет значение = «»), и моя модель проходит проверку, но это не так - пустая строка не является допустимым целым числом! Почему он отлично работает с включенным Javascript, но не работает на стороне сервера?