Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 一个MVC表单上的多个表单,使用循环创建,只有第一个表单提交数据_C#_Asp.net Mvc_Razor_Asp.net Mvc 5 - Fatal编程技术网

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

C# 一个MVC表单上的多个表单,使用循环创建,只有第一个表单提交数据,c#,asp.net-mvc,razor,asp.net-mvc-5,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,

我有下面的代码,只有第一个表单提交任何内容,下面提交空值,每个模型都有数据。如果我把它改成一个大的表单,所有的东西都会提交。为什么其他单独的表单发布空值

查看

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

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

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

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

<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>
  • @Html.TextBoxFor(a=>a[i].property1) @Html.CheckBoxFor(a=>a[i].property2) @Html.HiddenFor(a=>a[i].property3) //加上这个

  • 仅包含提交给的单击提交按钮的表单server@ConvertToInt32这只发生在第一个表单和第一个提交按钮上,以下表单在单击提交按钮时会显示空值。谢谢先生,这为我节省了大量时间!若集合是子集合,则名称应为name=“childvarname.index”,其中childvarname是变量中子集合的属性名称
    <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>