ASP.NET MVC DropDownListPara não selecionar valor do modelo

Eu estou usando o asp.net MVC 3, e apenas corri para um 'gotcha' usando oDropDownListFor Auxiliar de HTML.

Eu faço isso no meu controlador:

ViewBag.ShippingTypes = this.SelectListDataRepository.GetShippingTypes();

E aGetShippingTypes método:

public SelectList GetShippingTypes()
{
    List<ShippingTypeDto> shippingTypes = this._orderService.GetShippingTypes();

    return new SelectList(shippingTypes, "Id", "Name");
}

A razão pela qual eu coloquei noViewBag e não no modelo (tipifiquei fortemente modelos para cada visualização), é que tenho uma coleção de itens que renderiza usando um EditorTemplate, que também precisa acessar a lista de seleção ShippingTypes.

Caso contrário, preciso percorrer toda a coleção e atribuir uma propriedade ShippingTypes.

Por enquanto, tudo bem.

Na minha opinião, faço isso:

@Html.DropDownListFor(m => m.RequiredShippingTypeId, ViewBag.ShippingTypes as SelectList)

(RequiredShippingTypeId é do tipoInt32)

O que acontece é que o valor deRequiredShippingTypeId énão selecionado no menu suspenso.

Eu me deparei com isso:http://web.archive.org/web/20090628135923/http://blog.benhartonline.com/post/2008/11/24/ASPNET-MVC-SelectList-selectedValue-Gotcha.aspx

Ele sugere que o MVC procurará o valor selecionado deViewData, quando a lista de seleção é deViewData. Eu não tenho certeza se este é o caso mais, já que o post do blog é antigo e ele está falando sobre o MVC 1 beta.

Uma solução alternativa que resolve esse problema é esta:

@Html.DropDownListFor(m => m.RequiredShippingTypeId, new SelectList(ViewBag.ShippingTypes as IEnumerable<SelectListItem>, "Value", "Text", Model.RequiredShippingTypeId.ToString()))

Eu tentei nãoToString emRequiredShippingTypeId no final, o que me dá o mesmo comportamento de antes: Nenhum item selecionado.

Eu estou pensando que isso é um problema de tipo de dados. Por fim, o auxiliar de HTML está comparando strings (na Select List) com oInt32 (deRequiredShippingTypeId).

Mas por que não funciona ao colocar o SelectList noViewBag - quando funciona perfeitamente ao adicioná-lo a um modelo e fazer isso dentro da visão:

@Html.DropDownListFor(m => m.Product.RequiredShippingTypeId, Model.ShippingTypes)

questionAnswers(5)

yourAnswerToTheQuestion