c# - 一个 MVC 表单上的多个表单,用循环创建,只有第一个提交数据

标签 c# asp.net-mvc razor asp.net-mvc-5

我有以下代码,只有第一个表单提交任何内容,以下提交空值,每个模型都有数据。如果我把它改成一个大表格,一切都会提交。为什么其他个别表单会发布空值?

查看

@model myModel[]
<ul>
    @for (int i = 0; i < Model.Length; i++)
    {
        using (Html.BeginForm("controllerAction", "Controller", FormMethod.Post,
                               new { id="Form"+i }))
        {
            <li>
                @Html.TextBoxFor(a => a[i].property1)
                @Html.CheckBoxFor(a => a[i].property2)
                @Html.HiddenFor(a => a[i].property3)
                <input type="submit" />
            </li>
        }
    }
</ul>

Controller

[HttpPost]
public ActionResult controllerAction(myModel[] models)
{
    ...do stuff...
}

最佳答案

原因是您在 for 循环中使用索引器创建表单控件,并且您的 POST 方法参数是 myModel[] models

默认情况下,DefaultModelBinder 要求集合从零开始并且是连续的,因此如果您尝试提交第二个表单,您的回发 [1].property1: someValue 等。因为索引器从 1 开始,所以绑定(bind)失败并且模型为 null

您可以通过为模型绑定(bind)器使用的 Index 属性添加隐藏输入来解决此问题,以匹配非连续索引器

<li>
    @Html.TextBoxFor(a => a[i].property1)
    @Html.CheckBoxFor(a => a[i].property2)
    @Html.HiddenFor(a => a[i].property3)
    <input type="hidden" name="Index" value="@i" /> // add this
    <input type="submit" />
</li>

关于c# - 一个 MVC 表单上的多个表单,用循环创建,只有第一个提交数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32009825/

相关文章:

c# - MemoryCache AbsoluteExpiration 行为奇怪

c# - 在 MVC 中动态添加 ICollection 项到模型中 "creating"

asp.net-mvc - 如何在我的 Razor View 中使用 using 指令为类型别名?

javascript - MVC RAZOR jQuery Ajax 不在 IE 中执行 javascript

c# - MvcBuildViews 与 Razor 生成器

c# - C# 中的 Crystal 报表查看器

javascript - MVC5 上的掩码输入

c# - Documentum DFS,重命名 dm_user(user_name 属性)

asp.net-mvc - 从自定义 HTML Helper 访问 WebViewPage

asp.net-mvc - 在 View 中使用动态复选框列表,如何创建模型