J'ai le modèle de vue suivant
public class ProjectVM
{
....
[Display(Name = "Category")]
[Required(ErrorMessage = "Please select a category")]
public int CategoryID { get; set; }
public IEnumerable<SelectListItem> CategoryList { get; set; }
....
}
et la méthode de contrôleur suivante pour créer un nouveau projet et attribuer 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
}
et dans la vue
@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 vue s'affiche correctement mais lors de la soumission du formulaire, j'obtiens le message d'erreur suivant
InvalidOperationException: l'élément ViewData qui a la clé 'CategoryID' est de type 'System.Int32' mais doit être de type 'IEnumerable <SelectListItem>'.
La même erreur se produit en utilisant la @Html.DropDownList()
méthode, et si je passe la SelectList en utilisant un ViewBag
ou ViewData
.
selon la réponse de stephens (user3559349) , cela peut être utile:
ou dans ProjectVM:
la source
Le plus probable a causé une sorte d'erreur de redirection vers votre page et vous ne réinitialisez pas les listes déroulantes de votre modèle.
Assurez-vous d'initialiser vos listes déroulantes dans le constructeur du modèle ou à chaque fois avant d'envoyer ledit modèle à la page.
Sinon, vous devrez maintenir l'état des listes déroulantes via le sac de vue ou via les assistants de valeur masqués.
la source
J'ai eu le même problème, j'obtenais un ModelState invalide lorsque j'ai essayé de publier le formulaire. Pour moi, cela a été causé par la définition de CategoryId sur int, lorsque je l'ai changé en string, ModelState était valide et la méthode Create fonctionnait comme prévu.
la source
OK, la réponse standardisée de l'affiche expliquait parfaitement pourquoi l'erreur s'est produite, mais pas comment la faire fonctionner. Je ne suis pas sûr que ce soit vraiment une réponse, mais cela m'a orienté dans la bonne direction.
J'ai rencontré le même problème et j'ai trouvé un moyen astucieux de le résoudre. Je vais essayer de capturer cela ici. Avertissement - Je travaille sur des pages Web une fois par an environ et je ne sais vraiment pas ce que je fais la plupart du temps. Cette réponse ne doit en aucun cas être considérée comme une réponse "experte", mais elle fait le travail avec peu de travail ...
Étant donné que j'ai un objet de données (très probablement un objet de transfert de données) que je souhaite utiliser une liste déroulante pour fournir des valeurs valides pour un champ, comme ceci:
Ensuite, le ViewModel ressemble à ceci:
Le vrai problème ici, comme @Stephen l'a si éloquemment décrit ci-dessus, est que la liste de sélection n'est pas remplie sur la méthode POST dans le contrôleur. Ainsi, vos méthodes de contrôleur ressembleraient à ceci:
Voilà. Ce n'est PAS du code fonctionnel, j'ai copié / collé et édité pour le rendre simple, mais vous voyez l'idée. Si les membres de données du modèle de données d'origine et du modèle de vue dérivé ont le même nom, UpdateModel () fait un travail impressionnant en remplissant uniquement les bonnes données pour vous à partir des valeurs FormCollection.
Je poste ceci ici afin que je puisse trouver la réponse lorsque je rencontre inévitablement à nouveau ce problème - j'espère que cela aidera également quelqu'un d'autre.
la source
Dans mon cas, le premier identifiant de ma liste était zéro, une fois que j'ai changé l'identifiant pour qu'il commence à 1, cela fonctionnait.
la source