Estoy usando ASP.NET MVC 3, y acabo de ejecutar un 'gotcha' usando el DropDownListFor
HTML Helper.ASP.NET MVC DropDownListPara no seleccionar el valor del modelo
hago esto en mi controlador:
ViewBag.ShippingTypes = this.SelectListDataRepository.GetShippingTypes();
Y el GetShippingTypes
método:
public SelectList GetShippingTypes()
{
List<ShippingTypeDto> shippingTypes = this._orderService.GetShippingTypes();
return new SelectList(shippingTypes, "Id", "Name");
}
La razón por la que puse en el ViewBag
y no en el modelo (fuertemente He tecleado modelos para cada vista), es que tengo una colección de elementos que se renderiza usando un EditorTemplate, que también necesita acceder a la lista de selección ShippingTypes.
De lo contrario, tengo que recorrer toda la colección y asignarle una propiedad ShippingTypes.
Hasta ahora todo bien.
En mi opinión, hago esto:
@Html.DropDownListFor(m => m.RequiredShippingTypeId, ViewBag.ShippingTypes as SelectList)
(RequiredShippingTypeId
es de tipo Int32
)
Lo que sucede es, que el valor de RequiredShippingTypeId
es no seleccionado en el menú 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 de ViewData
, cuando la lista de selección es de ViewData
. No estoy seguro de que este sea el caso más, 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()))
no trataron de ToString
en RequiredShippingTypeId
al final, lo que me da el mismo comportamiento que antes: No hay elemento seleccionado.
Estoy pensando que esto es un problema de tipo de datos. En última instancia, el helper de HTML está comparando cadenas (en la lista de selección) con el Int32
(del RequiredShippingTypeId
).
Pero, ¿por qué no funciona al poner el SelectList en el ViewBag
- cuando funciona perfectamente cuando se añade a un modelo, y haciendo esto dentro de la vista:
@Html.DropDownListFor(m => m.Product.RequiredShippingTypeId, Model.ShippingTypes)
Gracias por la solución! Así que no es obvio que la magia solo funciona con expresiones lambda "simples", y el sistema no advierte al respecto. –