tipo selectlistitem ningún mvc idcliente hay elemento dropdownlist con clave asp.net-mvc

asp.net mvc - ningún - El elemento ViewData que tiene la clave ''MY KEY'' es del tipo ''System.String'' pero debe ser del tipo ''IEnumerable<SelectListItem>''



dropdownlist mvc 5 (7)

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<SelectListItem> 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<SelectListItem> 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:

<div class="editor-label"> <%: Html.LabelFor(model => model.basetype) %> </div> <div class="editor-field"> <%: Html.DropDownList("basetype") %> <%: Html.ValidationMessageFor(model => model.basetype) %> </div>

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.



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<SelectListItem>;%> <div class="editor-label"> <%: Html.Label("basetype") %> </div> <div class="editor-field"> <%: Html.DropDownList("basetype", basetype) %> <%: Html.ValidationMessage("basetype") %> </div>

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

public class ViewModel { //Model properties public IEnumerable<SelectListItem> basetype {get;set;} } public ActionResult Create() { var db = new DB(); IEnumerable<SelectListItem> 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:

<div class="editor-label"> <%: Html.LabelFor(model => model.basetype) %> </div> <div class="editor-field"> <%: Html.DropDownListFor(model=>model.basetype) %> <%: Html.ValidationMessageFor(model => model.basetype) %> </div>


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<SelectListItem>)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<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, IEnumerable<SelectListItem> 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<SelectListItem>)ViewData["basetype"], "")%>


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.


Recibirá este error si SelectList es nulo.


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


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