Il n'y a pas de ViewData élément de type 'IEnumerable<SelectListItem>" qui a la clé 'xxx'
Il y a quelques posts à ce sujet sur Stack Overflow, mais aucun avec une réponse qui semble corriger le problème dans ma situation actuelle.
J'ai une page avec un tableau en elle, chaque ligne a un certain nombre de champs de texte et un tableur. Toutes les listes déroulantes besoin d'utiliser le même SelectList de données donc j'ai configurer comme suit:
Contrôleur
ViewData["Submarkets"] = new SelectList(submarketRep.AllOrdered(), "id", "name");
Vue
<%= Html.DropDownList("submarket_0", (SelectList)ViewData["Submarkets"], "(none)") %>
J'ai utilisé exactement cette configuration dans de nombreux endroits, mais pour une raison quelconque dans ce point de vue, je reçois le message d'erreur:
Il n'y a pas de ViewData élément de type 'IEnumerable' qui a la clé 'submarket_0'.
- Avez-vous essayé?
<%= Html.DropDownList("submarket_0", ((SelectList)ViewData["Submarkets"]).Items, "(none)") %>
DropDownList prendIEnumerable<SelectListItem>
. - c'est en effet la façon dont je l'ai finalement trouvé la source de l'erreur 🙂 ainsi que des informations en provenance de certains autres postes! Merci
<%= Html.DropDownList("submarket_0", ViewData["Submarkets"] as IEnumerable<SelectListItem>, "(none)") %>
- Rencontré aujourd'hui et a trouvé le deuxième argument dans mon DropDownList aide a été nulle, par la constatation ci-dessous à partir de @jonathansewell.
InformationsquelleAutor Jimbo | 2010-05-17
Vous devez vous connecter pour publier un commentaire.
Ok, donc la réponse a été dérivée à partir de certains autres postes sur ce problème, et c'est:
Si votre
ViewData
contient unSelectList
avec le même nom que votreDropDownList
c'est à dire "submarket_0", le helper Html remplira automatiquement vosDropDownList
avec les données si vous ne spécifiez pas le 2e paramètre qui dans ce cas est la source SelectList.Ce qui s'est passé avec mon erreur était:
Parce que le tableau contenant les listes déroulantes était dans une vue partielle et la
ViewData
avait été modifié et ne contenait plus lesSelectList
j'avais référencé, leHtmlHelper
(au lieu de lancer une erreur) a essayé de trouver les SelectList appelé "submarket_0" dans le ViewData (GRRRR!!!) qui il TOUJOURS ne pourrais pas le trouver, et a jeté une erreur 🙂S'il vous plaît corrigez-moi si je suis mal
Ajax.ActionLink
. Il suffit d'ajouter leSelectList
Get
à laActionMethod
qui contient de l'appel Ajax.Vieille question, mais voici une autre explication du problème. Vous obtiendrez cette erreur, même si vous avez fortement typé points de vue et ne l'utilisez pas ViewData pour créer votre liste déroulante. La raison de l'erreur devient évident lorsque vous regardez la MVC source:
Donc, si vous avez quelque chose comme:
@Html.DropDownList("MyList", Model.DropDownData, "")
Et
Model.DropDownData
est null, MVC regarde à travers votre ViewData pour quelque chose nomméMyList
et renvoie une erreur si il n'y a aucun objet dans ViewData avec ce nom.J'ai eu la même erreur, je pense que le problème est que le texte de l'erreur est source de confusion, parce que sa donner un faux nom de la clé.
Dans votre cas, Il devrait dire "Il n'y a pas de ViewData élément de type 'IEnumerable' qui a la clé "sous-marchés"".
Mon erreur était une erreur d'orthographe dans le code de la vue (votre "sous-marchés"), mais le texte d'erreur m'a fait devenir fou.
Je poste cette réponse parce que je veux dire, les gens à la recherche de cette erreur, comme je l'étais, que le problème est que son pas de trouver l'interface IENumerable, mais dans le var qui son censé ressembler à cela ("sous-marchés" dans ce cas), pas dans celui montré dans l'erreur ("submarket_0").
Accepté réponse est très intéressante, mais comme vous avez dit que la convention est appliquée si vous ne spécifiez le 2ème paramètre, dans ce cas, il a été précisé, mais le var n'a pas été trouvé (dans votre cas, parce que la viewdata en n'avais pas, dans mon cas parce que j'ai mal orthographié le var nom)
Espérons que cette aide!
Le problème, c'est parce que de nouveau arrive sur le bouton soumettre, cliquez sur.
Ainsi, alors que la publication des données sur cliquez sur soumettre
de nouveau écrire avant de retourner Voir()
Vérifier l'espace de Noms.
Vous pouvez attribuer Système.Web.Les pages web.Html.SelectListItem dans le Contrôleur, au lieu de Système.Web.Mvc.SelectListItem.
C'est OK aussi; Par exemple:
==> Dans "NumberController" fichier:
==> Dans le fichier de la Vue (Créer.cshtml):
Maintenant, si nous retirer cette déclaration:
à partir de l'arrière de la déclaration suivante (dans notre contrôleur) :
nous allons voir cette erreur:
Il n'y a pas de ViewData élément de type 'IEnumerable' qui a la clé 'OperatorId'.
* Assurez-vous donc de l'existant de ces états. *
Pour moi, le problème à l'origine de cette erreur est survenu lorsque j'essayais de sauver une nouvelle ligne à la base de données, mais un champ a la valeur null. Dans la table de base de données de conception, ce champ n'est PAS NUL. Alors, quand j'ai essayé d'enregistrer une nouvelle ligne avec une valeur nulle pour les non nul champ, Visual Studio jeté cette erreur. Donc, j'ai fait en sorte que le terrain a été affecté une valeur, et le problème a été résolu.
Dans mon cas, j'ai trouvé que j'ai mis la méthode post privé à tort. après la modification du privé au public.
changement de
Fonctionne maintenant très bien.
La cause n'est pas contraire à la syntaxe plutôt que d'un usage inapproprié des objets.
Cycle de vie des objets dans ViewData, ViewBag, & Vue du Cycle de Vie est plus courte que dans la session. Les données définies dans les précédents seront perdus après une requête-réponse(si vous essayez d'accéder, après une requête-réponse, vous obtiendrez des exceptions). Si les premiers sont appropriés pour transmettre des données entre View & Contrôleur tandis que le second pour le stockage temporaire des données. Les données temporaires doit stocker dans la session de sorte que peut être consulté à de nombreuses reprises.
Dans mon cas, il y avait un conflit dans les espaces de noms , j'ai:
et
J'ai explicitement souhaitez utiliser le Mvc alors j'ai déclaré que :
SelectList
dansSystem.Collections.Generic
.