Я использую ASP.NET MVC 3 и просто запускаю "getcha" с помощью DropDownListFor
HTML Helper.
Я делаю это в своем контроллере:
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)