首页 >后端开发 >C++ >为什么我的 MVC 表单无法发布对象列表,导致控制器中出现空列表?

为什么我的 MVC 表单无法发布对象列表,导致控制器中出现空列表?

Barbara Streisand
Barbara Streisand原创
2025-01-21 14:36:10506浏览

Why is my MVC form failing to post a list of objects, resulting in a null list in the controller?

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

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn