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中文网其他相关文章!