MVC表單無法提交物件清單
在MVC應用程式中,使用者遇到一個問題:包含物件清單的表單無法將資料提交到控制器,導致傳遞的是空列表。該表單使用循環和部分視圖來呈現項目,但在提交後,控制器接收的是一個空枚舉。
問題分析
為了理解為什麼資料沒有正確提交,讓我們檢查提供的程式碼:
父視圖:
<code class="language-csharp">@foreach (var planVM in Model) { @Html.Partial("_partialView", planVM) }</code>
部分視圖 (_partialView):
<code class="language-csharp">@Html.HiddenFor(p => p.PlanID) @Html.HiddenFor(p => p.CurrentPlan) @Html.CheckBoxFor(p => p.ShouldCompare)</code>
PlanCompareViewModel 類別:
<code class="language-csharp">public class PlansCompareViewModel { public int PlanID { get; set; } public Plan CurrentPlan { get; set; } public bool ShouldCompare { get; set; } }</code>
解決方案
問題的根本原因在於表單元素的命名方式。如果沒有索引,模型綁定器無法區分清單的元素。為了解決這個問題,我們需要為表單元素的名稱分配正確的索引:
改進後的部分視圖 (_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>
此修改允許模型綁定器將各個資料元素與正確的列表項目關聯起來。
使用編輯器範本改進表單產生
為了更簡潔高效,建議使用編輯器範本。透過在EditorTemplates資料夾中建立PlanCompareViewModel.cshtml,部分視圖可以用以下內容取代:
<code class="language-csharp"><div> @Html.HiddenFor(p => p.PlanID) @Html.HiddenFor(p => p.CurrentPlan) @Html.CheckBoxFor(p => p.ShouldCompare) </div></code>
最後,父視圖可以簡化為:
<code class="language-csharp">@Html.EditorForModel()</code>
編輯器範本會自動處理索引,確保表單元素的名稱正確,以便進行模型綁定。
以上是為什麼我的 MVC 表單無法發佈物件列表,導致控制器中出現空白列表?的詳細內容。更多資訊請關注PHP中文網其他相關文章!