87 votes

Il n'y a pas d'élément ViewData de type 'IEnumerable<SelectListItem>' ayant la clé 'xxx'.

Il y a quelques messages à ce sujet sur Stack Overflow mais aucun n'apporte de réponse qui semble résoudre le problème dans ma situation actuelle.

J'ai une page contenant un tableau, dont chaque ligne comporte un certain nombre de champs de texte et une liste déroulante. Toutes les listes déroulantes doivent utiliser les mêmes données de SelectList et je les ai configurées comme suit :

Contrôleur

ViewData["Submarkets"] = new SelectList(submarketRep.AllOrdered(), "id", "name");

Voir

<%= Html.DropDownList("submarket_0", (SelectList)ViewData["Submarkets"], "(none)") %>

J'ai utilisé exactement cette configuration à de nombreux endroits, mais pour une raison quelconque, dans cette vue particulière, j'obtiens l'erreur suivante :

Il n'existe pas d'élément ViewData de type 'IEnumerable' dont la clé est 'submarket_0'.

1 votes

Avez-vous essayé ? <%= Html.DropDownList("submarket_0", ((SelectList)ViewData["Submarkets"]).Items, "(none)") %> DropDownList prend IEnumerable<SelectListItem> .

0 votes

@LukLed - c'est en effet comme ça que j'ai fini par trouver la source de l'erreur :) ainsi que des informations provenant d'autres posts ! Merci

0 votes

<%= Html.DropDownList("submarket_0", ViewData["Submarkets"] as IEnumerable<SelectListItem>, "(none)") %>

81voto

Jimbo Points 5133

Ok, donc la réponse a été dérivée d'autres messages sur ce problème et c'est le cas :

Si votre ViewData contient un SelectList avec le même nom que votre DropDownList c'est-à-dire "submarket_0", l'assistant Html remplira automatiquement votre fichier DropDownList avec ces données si vous ne spécifiez pas le 2ème paramètre qui, dans ce cas, est la SelectList source.

Ce qui s'est passé avec mon erreur était :

Parce que la table contenant les listes déroulantes se trouvait dans une vue partielle et que la vue ViewData avait été modifié et ne contenait plus le SelectList que j'avais référencé, le HtmlHelper (au lieu d'envoyer une erreur) a essayé de trouver la SelectList appelée "submarket_0" dans le ViewData (GRRRR !!!), ce qu'il n'a toujours pas pu faire, et a ensuite envoyé une erreur à ce sujet :)

Corrigez-moi si je me trompe.

108 votes

J'ai obtenu cette erreur parce que ma collection de SelectListItems pour la liste déroulante était nulle, ce qui est le même problème que vous, je pense.

6 votes

Pour les autres personnes confrontées à ce problème, enveloppez temporairement votre liste déroulante dans une vérification de nullité, par exemple @if (ViewData["Submarkets"] != null). Si la vue s'affiche alors sans générer d'erreur (et sans votre liste déroulante), vous aurez identifié votre problème. L'erreur "no view data item" est très trompeuse dans ce cas.

0 votes

J'ai rencontré ce problème en utilisant un Ajax.ActionLink . Il suffit d'ajouter le SelectList Get à la ActionMethod qui contient l'appel Ajax.

30voto

hawkke Points 2758

Vieille question, mais voici une autre explication du problème. Vous obtiendrez cette erreur même si vous avez des vues fortement typées et que vous n'utilisez pas ViewData pour créer votre liste déroulante. La raison de l'erreur peut devenir claire lorsque vous regardez le fichier Source MVC :

// If we got a null selectList, try to use ViewData to get the list of items.
if (selectList == null)
{
    selectList = htmlHelper.GetSelectData(name);
    usedViewData = true;
}

Donc si vous avez quelque chose comme :

@Html.DropDownList("MyList", Model.DropDownData, "")

Et Model.DropDownData est nulle, MVC recherche dans vos ViewData un élément nommé MyList et lance une erreur s'il n'y a pas d'objet dans ViewData avec ce nom.

1 votes

Bonjour, c'est aussi mon problème. Que faire ? si la liste est nulle ! pouvez-vous suggérer quelque chose,

4 votes

@transformer La chose la plus simple à faire serait de définir Model.DropDownData sur une liste vide au lieu de null. Si ce n'est pas possible, vous pourriez modifier votre balisage de rasoir pour vérifier si la liste est nulle, et si c'est le cas, rendre une liste de sélection vide.

15voto

Peto Points 1100

J'ai eu la même erreur, je pense que le problème est que le texte de l'erreur est confus parce qu'il donne un faux nom de clé.

Dans votre cas, il devrait dire "Il n'y a pas d'élément ViewData de type 'IEnumerable' qui a la clé "Submarkets"".

Mon erreur était une faute d'orthographe dans le code d'affichage (votre "Submarkets"), mais le texte de l'erreur m'a rendu fou.

Je poste cette réponse parce que je veux dire aux personnes qui cherchent cette erreur, comme je l'étais, que le problème est que Il ne trouve pas l'IENumerable, mais dans la variable qu'il est censé chercher ("Submarkets" dans ce cas), et non dans celle qui est affichée par erreur ("submarket_0"). .

La réponse acceptée est très intéressante, mais comme vous l'avez dit la convention est appliquée si vous ne spécifiez pas le 2ème paramètre, dans ce cas il a été spécifié, mais la var n'a pas été trouvée (dans votre cas parce que la viewdata ne l'avait pas, dans mon cas parce que j'ai mal orthographié le nom de la var).

J'espère que cela vous aidera !

9voto

rakesh Points 31

Le problème est que le post back se produit lors du clic sur le bouton submit. Ainsi, pendant l'affichage des données lors du clic sur le bouton de soumission écrire à nouveau avant de retourner View()

ViewData["Submarkets"] = new SelectList(submarketRep.AllOrdered(), "id", "name");

3voto

MovGP0 Points 77

Vérifiez le Namespace.

Vous pouvez attribuer System.Web.Webpages.Html.SelectListItem dans le contrôleur, au lieu de System.Web.Mvc.SelectListItem .

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