【问题标题】:Multiple forms on one MVC form, created with a loop, only the first submits data一个MVC表单上的多个表单,使用循环创建,只有第一个提交数据
【发布时间】:2015-11-07 16:41:55
【问题描述】:

我有如下代码,只有第一个表单提交什么,下面提交空值,每个模型都有数据。如果我将其更改为仅一个大表单,则所有内容都会提交。为什么其他单独的表单发布空值?

查看

@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>

控制器

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

【问题讨论】:

  • 仅包含提交到服务器的单击提交按钮的表单
  • @ConvertToInt32 这仅发生在第一个表单和第一个提交按钮上,以下表单在单击其提交按钮时发布空值。

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


【解决方案1】:

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

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

您可以通过为模型绑定器用来匹配非连续索引器的 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>

【讨论】:

  • 谢谢先生,这为我节省了很多时间!
  • 如果您的集合是子集合,则名称应为 name ="childvarname.index" 其中 childvarname 是变量中子集合的属性名称
猜你喜欢
  • 2019-03-18
  • 2015-07-12
  • 1970-01-01
  • 2010-10-03
  • 1970-01-01
  • 2019-07-25
  • 2016-11-10
  • 2021-01-10
  • 1970-01-01
相关资源
最近更新 更多