asp.net mvc from Il n'y a aucun élément ViewData de type 'IEnumerable<SelectListItem>' avec la clé 'xxx'




selected asp net mvc (7)

Vérifiez l'espace de noms.

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

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

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

Manette

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

Vue

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

J'ai utilisé exactement cette configuration dans beaucoup d'endroits, mais pour une raison quelconque dans cette vue particulière j'ai l'erreur:

Il n'existe aucun élément ViewData de type 'IEnumerable' avec la clé 'submarket_0'.


C'est OK aussi; Par exemple:
==> Dans le fichier "NumberController":

public ActionResult Create([Bind(Include = "NumberId,Number1,Number2,OperatorId")] Number number)
{
    if (ModelState.IsValid)
    {
        ...
        ...
        return RedirectToAction("Index");
    }
    ViewBag.OperatorId = new SelectList(db.Operators, "OperatorId", 
                                "OperatorSign", number.OperatorId);                
    return View();
}

==> Dans le fichier View (Create.cshtml):

<div class="form-group">
    @Html.LabelFor(model => model.Number1, htmlAttributes: new { @class = 
                   "control-label col-md-2" })
    <div class="col-md-10">
        @Html.EditorFor(model => model.Number1, new { htmlAttributes = new { 
                        @class = "form-control" } })
        @Html.ValidationMessageFor(model => model.Number1, "", new { @class = 
                                   "text-danger" })
    </div>
</div>

Maintenant, si nous supprimons cette déclaration:

ViewBag.OperatorId = new SelectList(db.Operators, "OperatorId", "OperatorSign", number.OperatorId);

à l'arrière de la déclaration suivante (dans notre contrôleur):

return View();

nous verrons cette erreur:

Il n'existe aucun élément ViewData de type 'IEnumerable' avec la clé 'OperatorId'.

* Soyez donc sûr de l'existant de ces déclarations. *


Le problème est dû à la publication de retour sur le bouton de soumission. Donc, tout en publiant des données sur soumettre cliquez à nouveau écrire avant de retourner View ()

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

Pour moi, le problème à l'origine de cette erreur est survenu lors de l'enregistrement d'une nouvelle ligne dans la base de données, mais un champ était null. Dans la conception de table de base de données, ce champ n'est pas NULL. Ainsi, lorsque j'ai essayé d'enregistrer une nouvelle ligne avec une valeur nulle pour le champ not-null, Visual Studio a jeté cette erreur. Ainsi, je me suis assuré que le champ a été assigné une valeur, et le problème a été fixé.


Ancienne question, mais voici une autre explication du problème. Vous obtiendrez cette erreur même si vous avez des vues fortement typées et n'utilisez pas ViewData pour créer votre liste déroulante. La raison de l'erreur peut devenir claire lorsque vous regardez la 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 null, MVC regarde à travers votre ViewData pour quelque chose appelé MyList et jette une erreur s'il n'y a aucun objet dans ViewData avec ce nom.


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

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

Ce qui est arrivé avec mon erreur était:

Parce que la table contenant les listes déroulantes était dans une vue partielle et que ViewData avait été modifié et ne contenait plus la liste SelectList que j'avais référencée, le HtmlHelper (au lieu de lancer une erreur) essayait de trouver la SelectList nommée "submarket_0" dans ViewData (GRRR !!!) qu'il ne trouvait toujours pas, puis a jeté une erreur sur ça :)

Corrigez-moi si j'ai tort, s'il-vous plait


Dans mon cas, il y avait un conflit dans les espaces de noms, j'ai:

using System.Web.Mvc;

et

using System.Collections.Generic;

Je veux explicitement utiliser le Mvc donc je l'ai déclaré comme:

new System.Web.Mvc.SelectList(...)




selectlist