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 ''?

Pourquoi mon DropdownList pour lancer 'L'élément ViewData avec la clé' xxx 'est de type' System.int32 'mais doit être de type' ienumerable ''?

Barbara Streisand
Barbara Streisandoriginal
2025-02-03 03:11:10213parcourir

Why Does My DropDownListFor Throw

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:

  • Repoupulation sur Post: Surtout, repeuplez 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.
  • Source de données: Remplacer 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.
  • Typage fort: L'utilisation de 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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn