ASP.NET MVC DropDownListPara no seleccionar el valor del modelo

Estoy usando ASP.NET MVC 3, y acabo de encontrarme con un 'gotcha' usando elDropDownListFor Ayudante de HTML.

Hago esto en mi controlador:

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

Y elGetShippingTypes método:

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

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

La razón por la que lo puse en elViewBag y no en el modelo (he tipeado con fuerza modelos para cada vista), es que tengo una colección de elementos que se procesan utilizando una Plantilla de Editor, que también necesita acceder a la lista de selección de Tipos de envío.

De lo contrario, tengo que recorrer toda la colección y asignar una propiedad de ShippingTypes.

Hasta ahora tan bueno.

En mi opinión, hago esto:

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

(RequiredShippingTypeId es de tipoInt32)

Lo que pasa es que el valor deRequiredShippingTypeId esno Seleccionado en el desplegable.

Me encontré con esto:http://web.archive.org/web/20090628135923/http://blog.benhartonline.com/post/2008/11/24/ASPNET-MVC-SelectList-selectedValue-Gotcha.aspx

Sugiere que MVC buscará el valor seleccionado deViewData, cuando la lista de selección es deViewData. Ya no estoy seguro de que este sea el caso, ya que la publicación del blog es antigua y está hablando de MVC 1 beta.

Una solución que resuelve este problema es la siguiente:

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

Traté de noToString enRequiredShippingTypeId al final, lo que me da el mismo comportamiento que antes: Ningún elemento seleccionado.

Estoy pensando que esto es un problema de tipo de datos. En última instancia, el ayudante de HTML está comparando cadenas (en la Lista de selección) con laInt32 (desde elRequiredShippingTypeId).

Pero, ¿por qué no funciona al colocar la Lista de selección en laViewBag - cuando funciona perfectamente al agregarlo a un modelo y hacerlo dentro de la vista:

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

Respuestas a la pregunta(5)

Su respuesta a la pregunta