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

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

Barbara Streisand
发布: 2025-01-21 14:36:10
原创
545 人浏览过

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

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板