Maison > développement back-end > C++ > Pourquoi mon formulaire MVC ne parvient-il pas à publier une liste d'objets, ce qui entraîne une liste nulle dans le contrôleur ?

Pourquoi mon formulaire MVC ne parvient-il pas à publier une liste d'objets, ce qui entraîne une liste nulle dans le contrôleur ?

Barbara Streisand
Libérer: 2025-01-21 14:36:10
original
500 Les gens l'ont consulté

Why is my MVC form failing to post a list of objects, resulting in a null list in the controller?

Le formulaire MVC ne peut pas soumettre la liste d'objets

Dans une application MVC, les utilisateurs ont rencontré un problème : un formulaire contenant une liste d'objets ne pouvait pas soumettre de données au contrôleur, ce qui entraînait la transmission d'une liste vide. Le formulaire utilise une boucle et une vue partielle pour restituer les éléments, mais lors de la soumission, le contrôleur reçoit une énumération vide.

Analyse du problème

Pour comprendre pourquoi les données ne sont pas soumises correctement, examinons le code fourni :

Vue parent :

<code class="language-csharp">@foreach (var planVM in Model)
{
    @Html.Partial("_partialView", planVM)
}</code>
Copier après la connexion

Vue partielle (_partialView) :

<code class="language-csharp">@Html.HiddenFor(p => p.PlanID)
@Html.HiddenFor(p => p.CurrentPlan)
@Html.CheckBoxFor(p => p.ShouldCompare)</code>
Copier après la connexion

Classe PlanCompareViewModel :

<code class="language-csharp">public class PlansCompareViewModel
{
    public int PlanID { get; set; }
    public Plan CurrentPlan { get; set; }
    public bool ShouldCompare { get; set; }
}</code>
Copier après la connexion

Solution

La cause première du problème réside dans la façon dont les éléments du formulaire sont nommés. Sans index, le classeur de modèles ne peut pas faire la distinction entre les éléments de la liste. Pour résoudre ce problème, nous devons attribuer l'index correct au nom de l'élément du formulaire :

Vue partielle améliorée (_partialView) :

<code class="language-csharp">@for (int i = 0; i < Model.Count(); i++)
{
    @Html.HiddenFor(p => p[i].PlanID)
    @Html.HiddenFor(p => p[i].CurrentPlan)
    @Html.CheckBoxFor(p => p[i].ShouldCompare)
}</code>
Copier après la connexion

Cette modification permet au classeur de modèles d'associer des éléments de données individuels aux éléments de liste corrects.

Améliorez la génération de formulaires à l'aide de modèles d'éditeur

Afin d'être plus concis et efficace, il est recommandé d'utiliser le modèle éditeur. Une partie de la vue peut être remplacée par le contenu suivant en créant PlanCompareViewModel.cshtml dans le dossier EditorTemplates :

<code class="language-csharp"><div>
    @Html.HiddenFor(p => p.PlanID)
    @Html.HiddenFor(p => p.CurrentPlan)
    @Html.CheckBoxFor(p => p.ShouldCompare)
</div></code>
Copier après la connexion

Enfin, la vue parent peut être simplifiée en :

<code class="language-csharp">@Html.EditorForModel()</code>
Copier après la connexion

Le modèle d'éditeur gère automatiquement l'indexation pour garantir que les éléments du formulaire sont nommés correctement pour la liaison du modèle.

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!

source:php.cn
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