Maison >développement back-end >C++ >Pourquoi mon DropdownList pour lancer 'L'élément ViewData avec la clé' xxx 'est de type' System.int32 'mais doit être de type' ienumerable ''?
ASP.NET MVC DropdownListfor pour l'erreur: Type Mismatch
Cet article aborde le commun InvalidOperationException
rencontré lors de l'utilisation DropDownListFor
dans ASP.NET MVC: "The ViewData item that has the key 'XXX' is of type 'System.Int32' but must be of type 'IEnumerable'."
Problème:
Cette erreur survient lorsque la propriété de votre modèle (par exemple, XXX
) lié à l'assistance DropDownListFor
est un entier (int
) au lieu d'une collection (IEnumerable<SelectListItem>
ou similaire). L'assistance DropDownListFor
s'attend à une collection d'éléments sélectionnables, pas une seule valeur entière représentant l'élément sélectionné.
Cause:
L'agradation se produit car la soumission de formulaire fournit une seule valeur entière (l'ID sélectionné), mais l'assistance a besoin d'une collection pour remplir les options de déroulement.
Exemple de scénario:
Disons que vous avez un modèle avec une propriété int
pour un ID de catégorie:
<code class="language-csharp">public class ProjectVM { public int CategoryID { get; set; } }</code>
et une vue en utilisant DropDownListFor
:
<code class="language-html">@Html.DropDownListFor(model => model.CategoryID, new SelectList(ViewBag.Categories, "ID", "Name"))</code>
lors de la soumission du formulaire, CategoryID
ne contiendra que l'ID entier sélectionné, provoquant l'erreur.
Solution:
La solution consiste à modifier votre modèle pour inclure une propriété détenant la collection d'éléments sélectionnables:
<code class="language-csharp">public class ProjectVM { public int CategoryID { get; set; } public IEnumerable<SelectListItem> CategoryList { get; set; } }</code>
Ensuite, remplissez cette propriété CategoryList
dans votre contrôleur:
<code class="language-csharp">public class HomeController : Controller { public ActionResult Create() { var model = new ProjectVM(); model.CategoryList = new SelectList(db.Categories, "ID", "Name"); // Assuming db is your database context return View(model); } [HttpPost] public ActionResult Create(ProjectVM model) { if (ModelState.IsValid) { // Save model to database } // Repopulate the CategoryList in case of validation errors model.CategoryList = new SelectList(db.Categories, "ID", "Name"); return View(model); } }</code>
Votre vue utiliserait alors:
<code class="language-html">@Html.DropDownListFor(model => model.CategoryID, Model.CategoryList)</code>
Considérations importantes:
CategoryList
dans votre méthode d'action HttpPost
. Si la validation échoue, le CategoryList
ne sera pas automatiquement repeuplé, conduisant à l'erreur sur un rendu ultérieur. db.Categories
par votre source de données réelle pour les catégories. Assurez-vous que les propriétés ID
et Name
correspondent à votre schéma de base de données. IEnumerable<SelectListItem>
est préférée pour un typage fort et une meilleure clarté de code par rapport à un générique IEnumerable
. En mettant en œuvre ces modifications, vous fournissez l'assistance DropDownListFor
avec la collection nécessaire des éléments, résolvant l'erreur de non-concordance.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!