J'ai donc un formulaire qui comprend une liste d'éléments, et chaque élément a une liste de sélection. Mon code est comme si (avec des éléments étrangers enlevés):MVC4 Html.DropDownListFor dans une boucle ne définissant pas l'option sélectionnée
@for(var i = 0; i < Model.InputSlots.Count; i++)
{
@Html.DropDownListFor(model => model.InputSlots[i].VariableId,
new SelectList(Model.Variables, "VariableId", "Name"),
"--Select Variable--",
new { @class = "span8" })
}
La liste déroulante affiche correctement, et si je sélectionne l'un des éléments et après la forme, les correctement les messages de sélection, mais quand je charge la page avec VariableId défini sur une option valide, il n'affiche pas l'option sélectionnée, mais affiche la valeur par défaut "--Sélectionnez Variable--" à la place.
J'utilise DropDownListFor à beaucoup d'autres endroits dans mon code, et cela fonctionne comme prévu, mais pas dans ce cas. La seule différence que je peux dire est que c'est référencer une propriété d'un élément de tableau.
J'ai défini un point d'arrêt dans la vue pour vérifier que Model.InputSlots [i] .VariableId est défini sur une option valide (2), et j'ai également consulté le code HTML résultant pour m'assurer qu'il y avait une option avec une valeur de 2 et les deux semblaient corrects, mais il n'y avait pas de "selected" sur l'élément option avec la valeur de 2.
Est-ce un comportement connu, ou suis-je en train de faire quelque chose de mal quelque part que je n'ai pas remarqué?
Mise à jour:
Réglage de l'élément sélectionné dans le constructeur SelectList fonctionne, à savoir:
@Html.DropDownListFor(model => model.InputSlots[i].VariableId,
new SelectList(Model.Variables, "VariableId", "Name", Model.InputSlots[i].VariableId),
"--Select Variable--",
new { @class = "span8" })
Mais il ne semble pas vouloir obtenir de l'expression comme dans d'autres cas.
Voir par ex. http: // stackoverflow.com/questions/17691742 et l'une ou l'autre des cinq questions qui y sont liées (ce sont toutes des variations de la même chose). – JimmiTh
Ces liens m'ont rappelé qu'il y avait un argument dans le constructeur de SelectList pour définir l'élément sélectionné, qui fonctionne, mais ils ne traitent pas vraiment la question de savoir pourquoi il ne l'obtient pas de mon lambda comme il est censé. Ma compréhension est que DropDownListFor est vraiment censé ignorer cet argument à moins qu'il ne puisse le comprendre à partir de l'expression. – Gerald
Bien, mal lu la question ... Le problème ici est que tout le helper utilise le lambda pour le traduire en une représentation de chaîne, qu'il utilise pour rechercher les valeurs dans 'ModelState' ou' ViewData'. En d'autres termes, à ce stade, il n'a aucune idée de la valeur de 'i', donc il ne peut pas trouver la valeur de' Model.InputSlots [i] '. – JimmiTh