ASP.NET MVC - Html.DropDownList - Valeur non définie, via ViewData.Modèle
Avez juste commencé à jouer avec ASP.NET MVC et ont trébuché sur la situation suivante. Il se sent beaucoup comme un bug, mais si ses pas, une explication serait apprécié 🙂
La Vue contient des jolis trucs de base
<%=Html.DropDownList("MyList", ViewData["MyListItems"] as SelectList)%>
<%=Html.TextBox("MyTextBox")%>
Lorsque vous n'utilisez pas un modèle, la valeur et l'élément sélectionné sont définies comme prévu:
//works fine
public ActionResult MyAction(){
ViewData["MyListItems"] = new SelectList(items, "Value", "Text"); //items is an ienumerable of {Value="XXX", Text="YYY"}
ViewData["MyList"] = "XXX"; //set the selected item to be the one with value 'XXX'
ViewData["MyTextBox"] = "ABC"; //sets textbox value to 'ABC'
return View();
}
Mais quand vous essayez de charger via un modèle, la zone de texte a la valeur définie comme prévu, mais la liste n'ya pas un élément sélectionné à l'ensemble.
//doesnt work
public ActionResult MyAction(){
ViewData["MyListItems"] = new SelectList(items, "Value", "Text"); //items is an ienumerable of {Value="XXX", Text="YYY"}
var model = new {
MyList = "XXX", //set the selected item to be the one with value 'XXX'
MyTextBox = "ABC" //sets textbox value to 'ABC'
}
return View(model);
}
Des idées? Mes pensées sont que peut-être lors de l'utilisation d'un modèle, nous nous sommes limités à réglage de l'élément sélectionné sur la SelectList constructeur au lieu d'utiliser le viewdata (qui fonctionne très bien) et en passant le selectlist dans le modèle - qui aurait l'avantage de nettoyer le code un peu - je me demandais simplement pourquoi cette méthode ne marche pas....
Un grand merci pour toutes les suggestions
Vous devez vous connecter pour publier un commentaire.
Après un tas de tergiversations, ça revient à la ligne de code suivante
qui signifie MVC est d'essayer de régler la valeur en regardant uniquement le ViewData Dictionnaire<> objet et non pas de la traversée vers le bas dans le ViewData.L'objet du modèle.
Si c'est un bug, une limitation ou une décision de conception, je ne suis pas sûr. Cependant, vous pouvez résoudre le problème de la manière suivante:
En fait, vous avez juste à passer dans
null
pour laHtml.DropDownList()
.J'ai eu exactement le même problème, et utilisé le Réflecteur de regarder le MVC Code Source.
Dans le
System.Web.Mvc.Extensions.SelectExtensions
de la classeSelectInternal()
méthode, il vérifie si le selectList paramètre est null ou pas.Si elle est transmise en tant que
null
, il regarde leSelectList
correctement.Ici est le "Code-behind".
Voici la vue HTML code.
Note: je suis en utilisant ASP.NET MVC 2.0 (Version Beta).
Mise à JOUR REMARQUE: le 31 janvier 2012
Après avoir longuement à l'aide de ASP.NET MVC pour les 3 dernières années, je préfère utiliser
additionalViewData
de laHtml.EditorFor()
méthode plus.Passe dans votre [les Éléments de la Liste] comme un
anonymous
objet avec le même nom de propriété car le Modèle de la propriété dans leHtml.EditorFor()
méthode.Si vous voulez plus de détails, veuillez vous référer à ma réponse dans un autre thread ici.
essayer le réglage de la valeur sélectionnée dans le contrôleur de l'action lors de la création de la SelectList collection.
ViewData["AddressTypeId"] = new SelectList(CustomerService.AddressType_List(), "AddressTypeId", "Nom", myItem.AddressTypeId);
Je suis évidemment en retard ici. Mais je voulais ajouter ce commentaire au cas où quelqu'un d'autre est venu à travers cette question.
MVC 2. Vous pouvez effectuer les opérations suivantes pour sélectionner l'élément...
Le quatrième paramètre prend une valeur et sélectionnez la valeur souhaitée dans la liste déroulante. Dans mon exemple j'ai une table appelée équipe et c'est que j'ai une relation à une table appelée fanYear et de la ligue.
Vous pouvez voir que j'ai d'abord obtenir l'équipe que je suis en train de monter, puis la construction d'un dropdownlist de fantasy de l'année et l'autre pour les ligues. Afin de déterminer l'année et de la ligue pour l'équipe, j'ai dû utiliser de l'Entité de Référence.
Voulais juste mettre ça là-bas. Je ne pouvais pas trouver des exemples de cela.
Lorsque vous avez des problèmes avec l'invalide ou nulle ViewData, faites attention à votre contrôleur de l'action.
Supposons que vous avez un ViewData appelé Maliste pour Html.DropDownlist appelé Maliste.
Si vous appelez
ModelState.AddModelError("MyList","Please select the profession")
vous allez de remplacer votre ViewData liste du contenu de ce texte d'avertissement.C'est aussi pourquoi les gens autour d'internet est d'avoir la valeur null problèmes avec ViewData sur DropDownList.
La ligne du bas est, faites attention à votre Id sur le modèle d'erreur, ils ne doivent pas interférer avec vos commandes html.
Mon souci est que vous ne pouvez utiliser la liste pour un champ. J'ai Entités avec de multiples champs d'utilisateur, j'utilise donc le suivant:
Ok j'ai peut-être raté quelque chose à partir de ce thread cependant en C#, les travaux suivants:
Où "
ProfessionGuid
' est la valeur sélectionnée dans la liste.Dans VB.Net je crois qu'il serait: