asp.net mvc - example - No hay ningún elemento ViewData de tipo ''IEnumerable<SelectListItem>'' que tenga la clave ''xxx''
dropdownlist mvc 5 razor (8)
El problema se debe a que la publicación posterior se produce al hacer clic en el botón Enviar. Por lo tanto, al publicar datos al enviar, haga clic de nuevo escriba antes de devolver View ()
ViewData["Submarkets"] = new SelectList(submarketRep.AllOrdered(), "id", "name");
Hay un par de publicaciones sobre esto en Stack Overflow pero ninguna con una respuesta que parezca solucionar el problema en mi situación actual.
Tengo una página con una tabla, cada fila tiene una cantidad de campos de texto y un menú desplegable. Todas las listas desplegables deben usar los mismos datos de la lista SelectList, así que lo he configurado de la siguiente manera:
Controlador
ViewData["Submarkets"] = new SelectList(submarketRep.AllOrdered(), "id", "name");
Ver
<%= Html.DropDownList("submarket_0", (SelectList)ViewData["Submarkets"], "(none)") %>
He utilizado exactamente esta configuración en muchos lugares, pero por alguna razón en esta vista en particular me sale el siguiente error:
No hay ningún elemento ViewData de tipo ''IEnumerable'' que tenga la clave ''submarket_0''.
En mi caso hubo un conflicto en los espacios de nombres, tengo:
using System.Web.Mvc;
y
using System.Collections.Generic;
Explícitamente deseo usar el Mvc así que lo declare como:
new System.Web.Mvc.SelectList(...)
Esto también está bien; Por ejemplo:
==> En el archivo "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();
}
==> En el archivo de vista (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>
Ahora si eliminamos esta declaración:
ViewBag.OperatorId = new SelectList(db.Operators, "OperatorId", "OperatorSign", number.OperatorId);
desde la parte posterior de la siguiente declaración (en nuestro controlador):
return View();
veremos este error:
No hay ningún elemento ViewData de tipo ''IEnumerable'' que tenga la clave ''OperatorId''.
* Así que asegúrese de la existencia de estas declaraciones. *
Ok, entonces la respuesta se deriva de algunas otras publicaciones sobre este problema y es:
Si su ViewData
contiene una lista de SelectList
con el mismo nombre que su DropDownList
es decir, "submarket_0", el helper de Html rellenará automáticamente su DropDownList
con esos datos si no especifica el 2º parámetro, que en este caso es la lista de selección de origen.
Lo que sucedió con mi error fue:
Como la tabla que contenía las listas desplegables estaba en una vista parcial y ViewData
había cambiado y ya no contenía la lista de SelectList
me había referido, el HtmlHelper
(en lugar de arrojar un error) intentó encontrar SelectList llamada "submarket_0" en ViewData (GRRRR !!!) que TODAVÍA no pudo encontrar, y luego arrojó un error sobre eso :)
Por favor corrígeme si estoy equivocado
Para mí, el problema que causó este error surgió cuando estaba guardando una nueva fila en la base de datos, pero un campo era nulo. En el diseño de la tabla de la base de datos, ese campo NO ES NULO. Así que cuando traté de guardar una nueva fila con un valor nulo para el campo no nulo, Visual Studio lanzó este error. Por lo tanto, me aseguré de que se asignara un valor al campo y el problema se solucionó.
Tuve el mismo error, creo que el problema es que el texto de error es confuso , porque da un nombre de clave falso.
En su caso, debe decir "No hay ningún elemento ViewData del tipo ''IEnumerable'' que tenga la clave" Submarkets "".
Mi error fue una falta de ortografía en el código de vista (sus "Submercados"), pero el texto de error me volvió loco.
Publiqué esta respuesta porque quiero decir que la gente que busca este error, como yo, dice que el problema es que no encuentra el IENumerable, sino la var que se supone que debe buscarlo ("Submercados" en este caso), no en el que se muestra por error ("submarket_0") .
La respuesta aceptada es muy interesante, pero como dijiste, la convención se aplica si no especificas el 2º parámetro, en este caso fue especificado, pero no se encontró la var (en tu caso porque la viewdata no lo tenía, en mi caso porque Escribí mal el nombre var)
¡Espero que esto ayude!
Una vieja pregunta, pero aquí hay otra explicación del problema. Obtendrá este error incluso si tiene vistas fuertemente tipadas y no está utilizando ViewData para crear su lista desplegable. El motivo del error puede quedar claro cuando observas la fuente de 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;
}
Entonces, si tienes algo como:
@Html.DropDownList("MyList", Model.DropDownData, "")
Y Model.DropDownData
es nulo, MVC busca en su ViewData algo llamado MyList
y arroja un error si no hay ningún objeto en ViewData con ese nombre.
Verifica el espacio de nombres.
Puede asignar System.Web.Webpages.Html.SelectListItem en el Controlador, en lugar de System.Web.Mvc.SelectListItem .