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
Libérer: 2025-02-03 03:11:10
original
257 Les gens l'ont consulté

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:

public class ProjectVM
{
    public int CategoryID { get; set; }
}
Copier après la connexion

et une vue en utilisant DropDownListFor:

@Html.DropDownListFor(model => model.CategoryID, new SelectList(ViewBag.Categories, "ID", "Name"))
Copier après la connexion

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:

public class ProjectVM
{
    public int CategoryID { get; set; }
    public IEnumerable<SelectListItem> CategoryList { get; set; }
}
Copier après la connexion

Ensuite, remplissez cette propriété CategoryList dans votre contrôleur:

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);
    }
}
Copier après la connexion

Votre vue utiliserait alors:

@Html.DropDownListFor(model => model.CategoryID, Model.CategoryList)
Copier après la connexion

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 de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal