asp.net-mvc - from - selected asp net mvc




Il n'y a aucun élément ViewData de type 'IEnumerable<SelectListItem>' avec la clé 'xxx' (6)

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'.


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.


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. *


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

Dans votre cas, il devrait indiquer "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 de la vue (votre "Submarkets"), mais le texte d'erreur m'a rendu fou.

Je publie cette réponse parce que je veux dire que les gens qui cherchent cette erreur, comme je l'étais, que le problème est qu'il ne trouve pas le IENumerable, mais dans le var qu'il est supposé le chercher ("Submarkets" dans ce cas), pas dans celui montré dans l'erreur ("submarket_0") .

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 car viewdata ne l'a pas J'ai mal orthographié le nom de var)

J'espère que cela t'aides!


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é.


Vérifiez l'espace de noms.

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





selectlist