ASP.NET MVC DropDownListFor ne sélectionne pas la valeur du modèle
Je suis en utilisant ASP.NET MVC 3, et viens de tomber sur une "chasse aux sorcières" à l'aide de la DropDownListFor
Helper HTML.
Je le fais dans mon Controller:
ViewBag.ShippingTypes = this.SelectListDataRepository.GetShippingTypes();
Et la GetShippingTypes
méthode:
public SelectList GetShippingTypes()
{
List<ShippingTypeDto> shippingTypes = this._orderService.GetShippingTypes();
return new SelectList(shippingTypes, "Id", "Name");
}
La raison je l'ai mis dans le ViewBag
et pas dans le modèle (j'ai fortement typé modèles pour chaque vue), c'est que j'ai une collection d'éléments qui rend l'aide d'un EditorTemplate, qui a également besoin d'accéder à la ShippingTypes liste de sélection.
Sinon j'ai besoin d'une boucle sur l'ensemble de la collection, et d'attribuer un ShippingTypes de la propriété alors.
So far So good.
De mon point de vue, je fais ceci:
@Html.DropDownListFor(m => m.RequiredShippingTypeId, ViewBag.ShippingTypes as SelectList)
(RequiredShippingTypeId
est de type Int32
)
Ce qui se passe, c'est que la valeur de RequiredShippingTypeId
est pas sélectionné dans le menu déroulant.
Je suis tombé sur ceci: http://web.archive.org/web/20090628135923/http://blog.benhartonline.com/post/2008/11/24/ASPNET-MVC-SelectList-selectedValue-Gotcha.aspx
Il suggère que MVC va rechercher la valeur sélectionnée de ViewData
lorsque la liste de sélection est de ViewData
. Je ne suis pas sûr que c'est plus le cas aujourd'hui, puisque le blog est vieux et qu'il parle de MVC 1 bêta.
Une solution qui résout ce problème est: est-ce
@Html.DropDownListFor(m => m.RequiredShippingTypeId, new SelectList(ViewBag.ShippingTypes as IEnumerable<SelectListItem>, "Value", "Text", Model.RequiredShippingTypeId.ToString()))
J'ai essayé de ne pas ToString
sur RequiredShippingTypeId
à la fin, ce qui me donne le même comportement qu'avant: Pas de point sélectionné.
Je pense que c'est une question de type de données. En fin de compte, le helper HTML est de comparer des chaînes de caractères (dans la Liste de sélection) avec le Int32
(à partir de la RequiredShippingTypeId
).
Mais pourquoi n'est-il pas de travail lors de la mise de la SelectList dans le ViewBag
-- quand il fonctionne parfaitement lors de l'ajout à un modèle, et ce faisant à l'intérieur de la vue:
@Html.DropDownListFor(m => m.Product.RequiredShippingTypeId, Model.ShippingTypes)
source d'informationauteur MartinHN
Vous devez vous connecter pour publier un commentaire.
La raison pour laquelle cela ne fonctionne pas en raison d'une limitation de la
DropDownListFor
helper: il est en mesure de déduire la valeur sélectionnée à l'aide de l'expression lambda passé en premier argument seulement si cette expression lambda est une propriété simple d'accès expression. Par exemple, cela ne fonctionne pas avec le tableau d'indexation à l'accès des expressions de ce qui est ton cas à cause de l'éditeur de modèle.Vous avez essentiellement (à l'exclusion de l'éditeur de modèle):
Suivant n'est pas pris en charge:
m => m.ShippingTypes[i].RequiredShippingTypeId
. Il fonctionne uniquement avec les simple l'accès à la propriété des expressions, mais pas avec indexé de la collection de l'accès.La solution que vous avez trouvée est la bonne façon de résoudre ce problème, en faisant explicitement en passant la valeur sélectionnée lors de la construction de la
SelectList
.Cela peut être idiot, mais ne l'ajout d'une variable dans votre vue de faire quoi que ce soit?
J'étais juste touchés par cette restriction et a trouvé une solution de contournement simple. Venez de définir la méthode d'extension qui produit à l'intérieur des
SelectList
avec un bon élément sélectionné.La meilleure chose est que cette extension peut être utilisée de la même façon que l'original
DropDownListFor
:Il y a une méthode surchargée pour @html.DropdownList pour gérer cela.
Il existe une alternative pour régler la valeur sélectionnée sur l'HTML de Liste Déroulante.
J'ai été en mesure d'obtenir la valeur sélectionnée à partir du modèle.
"value", "text", Model.Section[b].State
cette section la syntaxe ci-dessus ajoute l'attribut sélectionné à la valeur chargé à partir du Contrôleur de