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)

Ответы на вопрос(5)

Ваш ответ на вопрос