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
Barbara Streisandoriginal
2025-01-21 14:36:10501parcourir

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>

Vue partielle (_partialView) :

<code class="language-csharp">@Html.HiddenFor(p => p.PlanID)
@Html.HiddenFor(p => p.CurrentPlan)
@Html.CheckBoxFor(p => p.ShouldCompare)</code>

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>

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>

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>

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

<code class="language-csharp">@Html.EditorForModel()</code>

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!

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