Tengo el siguiente modelo de vista
public class ProjectVM
{
....
[Display(Name = "Category")]
[Required(ErrorMessage = "Please select a category")]
public int CategoryID { get; set; }
public IEnumerable<SelectListItem> CategoryList { get; set; }
....
}
y el siguiente método de controlador para crear un nuevo proyecto y asignar un Category
public ActionResult Create()
{
ProjectVM model = new ProjectVM
{
CategoryList = new SelectList(db.Categories, "ID", "Name")
}
return View(model);
}
public ActionResult Create(ProjectVM model)
{
if (!ModelState.IsValid)
{
return View(model);
}
// Save and redirect
}
y en la vista
@model ProjectVM
....
@using (Html.BeginForm())
{
....
@Html.LabelFor(m => m.CategoryID)
@Html.DropDownListFor(m => m.CategoryID, Model.CategoryList, "-Please select-")
@Html.ValidationMessageFor(m => m.CategoryID)
....
<input type="submit" value="Create" />
}
La vista se muestra correctamente, pero al enviar el formulario, aparece el siguiente mensaje de error
InvalidOperationException: el elemento ViewData que tiene la clave 'CategoryID' es de tipo 'System.Int32' pero debe ser de tipo 'IEnumerable <SelectListItem>'.
Se produce el mismo error con el @Html.DropDownList()
método, y si paso la lista de selección con un ViewBag
o ViewData
.
de acuerdo con la respuesta de stephens (user3559349) , esto puede ser útil:
o en ProjectVM:
fuente
Lo más probable es que haya causado algún tipo de error al redirigir a su página y no haya inicializado las listas desplegables de su modelo nuevamente.
Asegúrese de inicializar sus menús desplegables en el constructor del modelo o cada vez antes de enviar dicho modelo a la página.
De lo contrario, deberá mantener el estado de las listas desplegables a través de la bolsa de visualización o de los ayudantes de valor ocultos.
fuente
Tuve el mismo problema, obtenía un ModelState no válido cuando intenté publicar el formulario. Para mí, esto se debió a establecer CategoryId en int, cuando lo cambié a string, ModelState era válido y el método Create funcionó como se esperaba.
fuente
Bien, la respuesta predefinida del póster explicaba claramente por qué ocurrió el error, pero no cómo hacer que funcionara. No estoy seguro de que sea realmente una respuesta, pero me indicó la dirección correcta.
Me encontré con el mismo problema y encontré una manera hábil de resolverlo. Intentaré capturar eso aquí. Descargo de responsabilidad: trabajo en páginas web una vez al año y realmente no sé lo que estoy haciendo la mayor parte del tiempo. Esta respuesta de ninguna manera debe considerarse una respuesta de "experto", pero hace el trabajo con poco trabajo ...
Dado que tengo algún objeto de datos (probablemente un objeto de transferencia de datos), quiero usar una lista desplegable para proporcionar valores válidos para un campo, así:
Entonces el ViewModel se ve así:
El verdadero problema aquí, como @Stephen describió tan elocuentemente anteriormente, es que la lista de selección no se completa en el método POST en el controlador. Entonces sus métodos de controlador se verían así:
Ahí tienes. Este NO es un código de trabajo, lo copio / pego y edito para hacerlo simple, pero entiendes la idea. Si los miembros de datos tanto en el modelo de datos original como en el modelo de vista derivado tienen el mismo nombre, UpdateModel () hace un trabajo increíble al completar los datos correctos para usted a partir de los valores de FormCollection.
Estoy publicando esto aquí para poder encontrar la respuesta cuando inevitablemente me vuelva a encontrar con este problema; con suerte, también ayudará a alguien más.
fuente
En mi caso, el primer ID en mi lista fue cero, una vez que cambié el ID para comenzar desde 1, funcionó.
fuente