Я понимаю, что на этот вопрос уже дан ответ, но я бился головой о стену, посвященную этой самой проблеме, в течение прошедшего дня, пытаясь выяснить, почему приведенный выше пример работает нормально, а мой код - нет.
Оказывается, что если вы попытаетесь поместить список выбора в ViewData или ViewBag, используя то же имя, что и устанавливаемое свойство, проверка на стороне клиента не будет работать.Тем не менее, раскрывающийся список будет заполнен, поэтому он крайне неинтуитивен.
// Do NOT do this:
// In the controller:
ViewBag.ItemID = Database.Items.Select(i => new SelectListItem(){Value = i.ID, Text = i.Name});
// In the view:
@Html.DropDownList("ItemID")
// Instead DO this
// In the controller:
ViewBag.ItemIDList = Database.Items.Select(i => new SelectListItem(){Value = i.ID, Text = i.Name});
// In the view:
@Html.DropDownListFor(m => m.ItemID, (IEnumerable<SelectListItem>)ViewBag.ItemIDList)
Несмотря на то, что первый дает идеально функциональный раскрывающийся список, он почему-то просто не проходит проверку на стороне клиента.Если вы проверите HTML, все атрибуты элемента «select» просто отсутствуют.
Это полностью противоположно тому, как каждое другое поле или редактор заполняется в MVC, поскольку вы можете установить значения по умолчанию и текущие значения, установив ViewBag.ItemName = "Bob", и если у вас есть текстовое поле "ItemName", оно будетзаполнить с "Боб".
Надеюсь, моя публикация этого сообщения спасет кого-то от такой же многочасовой головной боли.