El elemento ViewData que tiene la clave ‘MY KEY’ es del tipo ‘System.String’ pero debe ser del tipo ‘IEnumerable ‘

Estoy intentando llenar una lista desplegable de una base de datos asignada con Linq-2-SQL, utilizando ASP.NET MVC 2, y sigo obteniendo este error.

Estoy tan confundido porque estoy declarando una variable del tipo IEnumerable en la segunda línea, pero el error me hace pensar que este no es el caso. Siento que esto debería ser muy simple, pero estoy luchando. Cualquier ayuda es apreciada.

Aquí están los bits interesantes de mi controlador:

 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(); } 

Y aquí están los aspectos interesantes de mi punto de vista:

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

Aquí está la acción POST al enviar el Formulario

 // 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); } } 

Gracias.

Tuve el mismo problema, y ​​finalmente obtuve la respuesta …

El problema es que en la acción POST, después de enviar el formulario, ModelState no es válido, o está capturando un error en try / catch, por lo que se devuelve la vista. Pero esta vez la Vista no tiene el ViewData["basetype"] correctamente configurado.

Necesita volver a poblarlo, probablemente con el mismo código utilizado anteriormente, así que repita esto:

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

antes de la return View(meal) en el método [HttpPost] .

exactamente esto resolverá su problema:

 [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); } } 

Sé que esta pregunta es muy antigua, pero hoy vine aquí con el mismo problema, para que otros puedan venir más tarde …

Recibirá este error si SelectList es nulo.

Acabo de enterarme de este problema y este artículo me ayudó a superarlo : http://odetocode.com/Blogs/scott/archive/2010/01/18/drop-down-lists-and-asp-net-mvc. aspx

La causa más probable es que su colección se vuelva a llenar después del po

Intente agregar una cadena para el nombre de su lista desplegable como el primer parámetro y saque el elemento de su viewdata:

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

Aquí también hay un método de extensión que puede usar para que la lista desplegable esté configurada de manera similar a como lo hizo con sus otros controles:

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

Por ejemplo

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

Está configurando la colección como un elemento en el diccionario ViewData e intentando recuperarla como propiedad en el modelo. Una solución simple sería hacer referencia a ella de la misma manera que la configuró:

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

Alternativamente, el siguiente código usa una vista fuertemente tipada:

 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 }); } 

Luego, en su vista fuertemente tipada:

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

Si usa el método Html.DropDownList() , es posible que se produzca el mismo error si su elemento ViewData / Viewbag no está configurado, como respondió @ Peto.

Pero puede no establecerse en caso de que el elemento de ajuste del controlador sea correcto, pero en la vista principal se usa la llamada de viw parcial con los nuevos valores de ViewDataDictionary.

si tiene @Html.Partial("Partianame", Model,new ViewDataDictionary() { /* ... */ }) , su vista parcial no verá los datos de ViewBag y ViewBag , eliminará el new ViewDataDictionary() parámetro new ViewDataDictionary()

Para futuros lectores,

Hoy me encontré con el problema y no pude solucionarlo. Resultó ser realmente simple después de todo. Estaba trabajando con una tabla + vista. Cuando actualicé la tabla (agregué unas pocas columnas) me olvidé de actualizar (soltar y volver a crear) la vista, lo que me causó el problema. Espero que ayude a alguien.

Para lectores futuros, si está usando una afeitadora, intente cambiar el tipo de elemento de la lista de selección de Lista a IEnumerable.

De

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

A

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