ASP.NET MVC DropDownList для не выбора значения из модели
Я использую ASP.NET MVC 3 и только что натолкнулся на 'gotcha' с использованием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
являетсяnot выбран в раскрывающемся списке.
Я сталкивался с этим: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)