Sto utilizzando ASP.NET MVC 3 e ho appena eseguito un 'gotcha' utilizzando l'helper HTML DropDownListFor
.ASP.NET MVC DropDownListPer non selezionare il valore dal modello
Lo faccio nel mio controller:
ViewBag.ShippingTypes = this.SelectListDataRepository.GetShippingTypes();
e il metodo GetShippingTypes
:
public SelectList GetShippingTypes()
{
List<ShippingTypeDto> shippingTypes = this._orderService.GetShippingTypes();
return new SelectList(shippingTypes, "Id", "Name");
}
La ragione per cui ho messo nel ViewBag
e non nel modello (che ho fortemente tipizzato modelli per ogni vista), è che ho una raccolta di elementi che esegue il rendering utilizzando un EditorTemplate, che deve anche accedere all'elenco di selezione ShippingTypes.
In caso contrario, ho bisogno di scorrere l'intera raccolta e assegnare quindi una proprietà ShippingTypes.
Fin qui tutto bene.
A mio avviso, faccio questo:
@Html.DropDownListFor(m => m.RequiredShippingTypeId, ViewBag.ShippingTypes as SelectList)
(RequiredShippingTypeId
è di tipo Int32
)
ciò che accade è che il valore di RequiredShippingTypeId
è non selezionato nel menu a discesa.
mi sono imbattuto in questo: http://web.archive.org/web/20090628135923/http://blog.benhartonline.com/post/2008/11/24/ASPNET-MVC-SelectList-selectedValue-Gotcha.aspx
Egli suggerisce che MVC si ricerca il valore selezionato da ViewData
, quando la lista di selezione è da ViewData
. Non sono più sicuro che sia il caso, dal momento che il post sul blog è vecchio e parla di MVC 1 beta.
Una soluzione che risolve questo problema è questo:
@Html.DropDownListFor(m => m.RequiredShippingTypeId, new SelectList(ViewBag.ShippingTypes as IEnumerable<SelectListItem>, "Value", "Text", Model.RequiredShippingTypeId.ToString()))
ho cercato di non ToString
sul RequiredShippingTypeId
alla fine, che mi dà lo stesso comportamento di prima: Nessun elemento selezionato.
Sto pensando che questo è un problema di tipo di dati. In definitiva, l'helper HTML sta confrontando le stringhe (nell'elenco Seleziona) con lo Int32
(dallo RequiredShippingTypeId
).
Ma perché non funziona quando mettere il SelectList nel ViewBag
- quando funziona perfettamente quando si aggiunge ad un modello, e facendo questo all'interno della vista:
@Html.DropDownListFor(m => m.Product.RequiredShippingTypeId, Model.ShippingTypes)
Grazie per la soluzione! Quindi non ovvio che la magia funzioni solo con espressioni "semplici" lambda, e il sistema non dà alcun avvertimento a riguardo. –