3 votes

Html.DropDownList et modelbinding

Pourquoi le modelbinding ne fonctionne-t-il pas sur un DropDown ?
Qu'est-ce que je fais de mal ?
Pour illustrer mon problème, j'ai fait ce qui suit :

Création d'un nouveau projet asp.net MVC (beta1) Création de la classe suivante :

HomeViewData : ViewDataDictionary  
+List : SelectList

Ajout d'un viewdata à la classe HomeController comme suit

Homecontroller: Controller
+HomeViewData vd = new HomeViewData

J'ai ajouté les lignes suivantes à ma méthode Home.Index()

vd.list = new SelectList(new List<string>(){"test", "test1", "test2"});
return View("Index", vd);

Et j'ai répliqué la même méthode mais avec une signature différente pour attraper les appels de retour.

[AcceptVerps(HttpVerbs.Post)]
public ActionResult Index(HomeViewdata d)

Ici, j'ai ajouté un point d'arrêt à la première ligne de code.
Puis j'ai ajouté le code suivant à mon Index.aspx

<%Html.BeginForm();%>
    <%=Html.DropDownList("List")%>
<%Html.EndForm();%>

En conséquence, j'obtiens une page qui présente une belle liste déroulante avec les valeurs test, test1 et test2.
Ensuite, après avoir sélectionné une valeur, j'appuie sur la touche Entrée (je n'ai pas pris la peine d'utiliser un bouton d'envoi) et je vois comment mon point d'arrêt arrête le code. Je vérifie la valeur de la HomeViewData... NULL

Si je fais le même exercice mais avec une zone de texte par exemple, tout fonctionne bien...
--EDIT--
Les choses que j'ai essayées depuis ce post :

  • Ajout d'un attribut [Bind(Prefix="")] à mon action comme suggéré par Phil
  • Ajout d'un [Bind(Prefix=" ")] pour voir si cela supprimerait l'erreur "nom vide non autorisé".
  • Ajout du nom du paramètre de mon action dans le nom de mon contrôle

3voto

Haacked Points 31070

Ah, le problème ici est que par convention, le classeur de modèles recherche des valeurs sous la forme "d.PropertyName" parce que l'argument de votre méthode d'action Index est "d".

Comme vous pouvez avoir plusieurs arguments pour une méthode d'action, nous utilisons le nom de l'argument comme préfixe par défaut.

Pour résoudre ce problème, il suffit d'utiliser l'attribut Bind pour indiquer à MVC de ne pas utiliser de préfixe.

[AcceptVerps(HttpVerbs.Post)]
public ActionResult Index([Bind(Prefix="")]HomeViewdata d)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X