MVC-Formular kann keine Objektliste übermitteln
In einer MVC-Anwendung stießen Benutzer auf ein Problem: Ein Formular mit einer Liste von Objekten konnte keine Daten an den Controller übermitteln, was dazu führte, dass eine leere Liste übergeben wurde. Das Formular verwendet eine Schleife und eine Teilansicht zum Rendern der Elemente, aber bei der Übermittlung erhält der Controller eine leere Aufzählung.
Problemanalyse
Um zu verstehen, warum die Daten nicht korrekt übermittelt werden, schauen wir uns den bereitgestellten Code an:
Übergeordnete Ansicht:
<code class="language-csharp">@foreach (var planVM in Model) { @Html.Partial("_partialView", planVM) }</code>
Teilansicht (_partialView):
<code class="language-csharp">@Html.HiddenFor(p => p.PlanID) @Html.HiddenFor(p => p.CurrentPlan) @Html.CheckBoxFor(p => p.ShouldCompare)</code>
PlanCompareViewModel-Klasse:
<code class="language-csharp">public class PlansCompareViewModel { public int PlanID { get; set; } public Plan CurrentPlan { get; set; } public bool ShouldCompare { get; set; } }</code>
Lösung
Die Hauptursache des Problems liegt in der Art und Weise, wie die Formularelemente benannt werden. Ohne Index kann der Modellordner die Elemente der Liste nicht unterscheiden. Um dies zu beheben, müssen wir dem Namen des Formularelements den richtigen Index zuweisen:
Verbesserte Teilansicht (_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>
Diese Änderung ermöglicht es dem Modellordner, einzelne Datenelemente den richtigen Listenelementen zuzuordnen.
Verbessern Sie die Formularerstellung mithilfe von Editor-Vorlagen
Um prägnanter und effizienter zu sein, wird empfohlen, die Editor-Vorlage zu verwenden. Ein Teil der Ansicht kann durch den folgenden Inhalt ersetzt werden, indem PlanCompareViewModel.cshtml im EditorTemplates-Ordner erstellt wird:
<code class="language-csharp"><div> @Html.HiddenFor(p => p.PlanID) @Html.HiddenFor(p => p.CurrentPlan) @Html.CheckBoxFor(p => p.ShouldCompare) </div></code>
Abschließend kann die übergeordnete Ansicht wie folgt vereinfacht werden:
<code class="language-csharp">@Html.EditorForModel()</code>
Die Editorvorlage übernimmt automatisch die Indizierung, um sicherzustellen, dass Formularelemente für die Modellbindung korrekt benannt werden.
Das obige ist der detaillierte Inhalt vonWarum kann mein MVC-Formular keine Liste von Objekten veröffentlichen, was zu einer Nullliste im Controller führt?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!