L’élément ViewData qui a la clé ‘MY KEY’ est de type ‘System.Ssortingng’ mais doit être de type ‘IEnumerable ‘

J’essaie de remplir une liste déroulante à partir d’une firebase database associée à Linq-2-SQL, à l’aide d’ASP.NET MVC 2, et de continuer à obtenir cette erreur.

Je suis tellement confus parce que je déclare une variable de type IEnumerable sur la deuxième ligne, mais l’erreur me fait penser que ce n’est pas le cas. Je pense que cela devrait être très simple, mais je me bats. Toute aide est appréciée.

Voici les éléments intéressants de mon contrôleur:

 public ActionResult Create() { var db = new DB(); IEnumerable basetypes = db.Basetypes.Select( b => new SelectListItem { Value = b.basetype, Text = b.basetype }); ViewData["basetype"] = basetypes; return View(); } 

Et voici les éléments intéressants de mon sharepoint vue:

 
model.basetype) %>
model.basetype) %>

Voici l’action POST lors de la soumission du formulaire

 // POST: /Meals/Create [HttpPost] public ActionResult Create(Meal meal) { if (ModelState.IsValid) { try { // TODO: Add insert logic here var db = new DB(); db.Meals.InsertOnSubmit(meal); db.SubmitChanges(); return RedirectToAction("Index"); } catch { return View(meal); } } else { return View(meal); } } 

Merci.

J’ai eu le même problème et finalement j’ai eu la réponse …

Le problème est que dans l’action POST, après avoir soumis le formulaire, le ModelState n’est pas valide ou qu’il détecte une erreur dans try / catch, de sorte que la vue est renvoyée. Mais cette fois, la vue n’a pas le ViewData["basetype"] correctement défini.

Vous devez le remplir à nouveau, probablement avec le même code utilisé auparavant, alors répétez ceci:

 var db = new DB(); IEnumerable basetypes = db.Basetypes.Select( b => new SelectListItem { Value = b.basetype, Text = b.basetype }); ViewData["basetype"] = basetypes; 

avant le return View(meal) dans la méthode [HttpPost] .

exactement cela résoudra votre problème:

 [HttpPost] public ActionResult Create(Meal meal) { if (ModelState.IsValid) { try { // TODO: Add insert logic here var db = new DB(); db.Meals.InsertOnSubmit(meal); db.SubmitChanges(); return RedirectToAction("Index"); } catch { var db = new DB(); IEnumerable basetypes = db.Basetypes.Select( b => new SelectListItem { Value = b.basetype, Text = b.basetype }); ViewData["basetype"] = basetypes; return View(meal); } } else { var db = new DB(); IEnumerable basetypes = db.Basetypes.Select( b => new SelectListItem { Value = b.basetype, Text = b.basetype }); ViewData["basetype"] = basetypes; return View(meal); } } 

Je sais que cette question est très ancienne, mais je suis venu ici aujourd’hui avec le même problème, alors d’autres pourraient venir ici plus tard …

Vous recevrez cette erreur si le SelectList est null.

Je viens de tomber sur ce problème et cet article m’a aidé à travers cela – http://odetocode.com/Blogs/scott/archive/2010/01/18/drop-down-lists-and-asp-net-mvc. aspx

Le plus probable cause que votre collection est repeuplée après le po

Essayez d’append une chaîne pour le nom de votre liste déroulante en tant que premier paramètre et récupérez l’élément de votre vue:

  <%= Html.DropDownList("SomeDropdownName", (IEnumerable)ViewData["basetype"]) %> 

Voici également une méthode d’extension que vous pouvez utiliser pour que la liste déroulante soit configurée de la même façon que vous avez effectué vos autres contrôles:

  public static ssortingng DropDownList(this HtmlHelper htmlHelper, Expression> expression, IEnumerable selectList, ssortingng optionLabel) where TModel : class { ssortingng inputName = ExpressionHelper.GetInputName(expression); return htmlHelper.DropDownList(inputName, selectList, optionLabel); } 

Par exemple

 <%= Html.DropDownList(x => x.BaseType, (IEnumerable)ViewData["basetype"], "")%> 

Vous définissez la collection en tant qu’élément du dictionnaire ViewData et essayez de la récupérer en tant que propriété sur le modèle. Une solution simple serait de la référencer de la même manière que vous l’avez définie:

  <%var basetype = ViewData["basetype"] as IEnumerable;%> 
<%: Html.Label("basetype") %>
<%: Html.DropDownList("basetype", basetype) %> <%: Html.ValidationMessage("basetype") %>

Sinon, le code ci-dessous utilise une vue fortement typée:

 public class ViewModel { //Model properties public IEnumerable basetype {get;set;} } public ActionResult Create() { var db = new DB(); IEnumerable basetypes = db.Basetypes.Select(b => new SelectListItem { Value = b.basetype, Text = b.basetype }); return View(new ViewModel { basetype=basetypes }); } 

Ensuite, dans votre vue fortement typée:

  
<%: Html.LabelFor(model => model.basetype) %>
<%: Html.DropDownListFor(model=>model.basetype) %> <%: Html.ValidationMessageFor(model => model.basetype) %>

Si vous utilisez la méthode Html.DropDownList() – la même erreur peut se produire si votre élément ViewData / Viewbag n’est pas défini, comme @Peto a répondu.

Mais il peut ne pas être défini en cas d’élément de jeu de contrôleurs correctement, mais dans la vue principale, vous utilisez l’appel viw partiel avec de nouvelles valeurs ViewDataDictionary.

si vous avez @Html.Partial("Partianame", Model,new ViewDataDictionary() { /* ... */ }) alors votre vue partielle ne verra pas les données ViewData et ViewBag , supprimera le new ViewDataDictionary() paramètre new ViewDataDictionary()

Aux futurs lecteurs,

J’ai rencontré le problème aujourd’hui et je ne pouvais pas le réparer. Il s’est avéré être très simple après tout. Je travaillais avec une table + vue. Lorsque j’ai mis à jour la table (ajouté quelques colonnes), j’ai oublié de mettre à jour (supprimer et recréer) la vue, ce qui a causé le problème pour moi. J’espère que ça aide quelqu’un.

Pour les futurs lecteurs, si vous utilisez Razor, essayez de changer le type d’élément selectlist de List en IEnumerable.

De

 @Html.DropDownListFor(m => m.id, ViewBag.SomeList as List) 

À

 @Html.DropDownListFor(m => m.id, ViewBag.SomeList as IEnumerable)