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!