Я использую ASP.NET MVC 3 и просто столкнулся с «gotcha» с помощью HTML-помощника DropDownListFor
.ASP.NET MVC DropDownListДля выбора значения из модели
Я делаю это в моем контроллере:
ViewBag.ShippingTypes = this.SelectListDataRepository.GetShippingTypes();
И GetShippingTypes
метод:
public SelectList GetShippingTypes()
{
List<ShippingTypeDto> shippingTypes = this._orderService.GetShippingTypes();
return new SelectList(shippingTypes, "Id", "Name");
}
Причина, я положил его в ViewBag
, а не в модели (я сильно типизированных модели каждый вид), заключается в том, что у меня есть набор элементов, который отображает с помощью EditorTemplate, который также должен получить доступ к списку выбора ShippingTypes.
В противном случае мне нужно пропустить всю коллекцию и назначить свойство ShippingTypes.
Пока все хорошо.
На мой взгляд, я делаю это:
@Html.DropDownListFor(m => m.RequiredShippingTypeId, ViewBag.ShippingTypes as SelectList)
(RequiredShippingTypeId
имеет тип Int32
)
Что происходит, что значение RequiredShippingTypeId
является не выбран в раскрывающемся списке.
Я наткнулся на это: http://web.archive.org/web/20090628135923/http://blog.benhartonline.com/post/2008/11/24/ASPNET-MVC-SelectList-selectedValue-Gotcha.aspx
Он предполагает, что MVC будет искать выбранное значение из ViewData
, когда список выбора составляет от ViewData
. Я не уверен, что это так, потому что сообщение в блоге старое, и он говорит о бета-версии MVC 1.
Обходной, который решает этот вопрос заключается в следующем:
@Html.DropDownListFor(m => m.RequiredShippingTypeId, new SelectList(ViewBag.ShippingTypes as IEnumerable<SelectListItem>, "Value", "Text", Model.RequiredShippingTypeId.ToString()))
Я пытался не ToString
на RequiredShippingTypeId
в конце, что дает мне такое же поведение, как и раньше: Нет выбранного элемента.
Я думаю, что это проблема с типом данных. В конечном счете, HTML-помощник сравнивает строки (в списке выбора) с Int32
(от RequiredShippingTypeId
).
Но почему она не работает при вводе SelectList в ViewBag
- когда она прекрасно работает при добавлении его к модели, и делать это внутри вида:
@Html.DropDownListFor(m => m.Product.RequiredShippingTypeId, Model.ShippingTypes)
Спасибо за обходной путь! Настолько неочевидно, что магия работает только с «простыми» лямбда-выражениями, и система не дает никаких предупреждений об этом. –