ASP.NET MVC не может связать и проверить DropDownListFor, если установлен диапазон и отключен Javascript

У меня есть следующее свойство в моей модели:

    [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, но не работает на стороне сервера?


person JustAMartin    schedule 18.09.2012    source источник


Ответы (1)


В своем действии POST не забудьте повторно заполнить свойство ViewBag.Numbers так же, как вы делали это в действии GET перед возвратом представления:

[HttpPost]
public ActionResult SomeAction(MyViewModel model)
{
    // some processing ...

    // now repopulate the ViewBag if you intend to return the same view
    ViewBag.Numbers = numbers
        .Select(n => new SelectListItem { 
            Text = n.Number.ToString(), 
            Value = n.Number.ToString() 
        })
        .ToList();

    return View(model);
}
person Darin Dimitrov    schedule 18.09.2012
comment
Спасибо, это устранило проблему с исключением. И проверка модели не проходит, как и ожидалось. - person JustAMartin; 18.09.2012