我搜索了四周,找不到我的问题的答案。在foreach循环中的表单不会将模型发回控制器
我有一个观点,即需要接受Foo
在像这样:
@model IEnumerable<MyApplication.Models.Foo>
里面我有一个表视图。我通过我的Foo
模型填充表格,只是执行简单的foreach
循环。我添加了一列,用户可以在文本区域的每一行添加详细信息并保存。
所以认为是这样的:
@foreach (var item in Model)
{
<tr>
<th>
@using (Html.BeginForm("AddDetails", "MyController", FormMethod.Post))
{
@Html.AntiForgeryToken()
@Html.HiddenFor(u => item.Id)
@Html.TextAreaFor(u => item.Details, new { @class = "form-control" })
<input type="submit" value="Save" class="btn btn-sm btn-default" />
}
</th>
</tr>
}
我的控制器的设置是这样的:
[HttpPost]
public ActionResult AddDetails(Foo foo)
{
}
当我设置一个断点该控制器上foo
总是有null
值的Details
财产和Id
始终为0
。当它传递到视图中时,它的所有属性都设置为正确,所以我不确定它为什么不能正确回发?
我已经试过这样:
@using (Html.BeginForm("AddDetails", "MyController", FormMethod.Post, new { foo = Model }))
我也试图消除foreach
循环和改变它只是一个单一的模型视图和查看通过接受只是单一的模式,而不是IEnumerable
。当我这样做时,它会回传得很好。
而且这也行不通。我想知道这是否与我的表单处于foreach
循环内有关,也许我需要做更多的工作,比如为元素添加一个data-id
属性,然后捕获按钮上的单击事件并执行一个AJAX调用控制器并传递正确的值?
编辑对不起,我完全忘了视图模型。这里是什么样子:
public class Foo
{
public int Id { get; set; }
public string Details { get; set; }
}
如果您更多地了解与视图绑定的视图模型/使用表格 – mmcrae
将“foreach”更改为“for”循环时会发生什么,可能会有所帮助?我很确定这是你的问题,因为这样,默认的modelbinder不能正确地重建你的对象来发布。 [看这个问题](http://stackoverflow.com/questions/15636284/for-each-loop-with-controls-and-submitting-form-html-beginform-in-mvc-4)作为参考 – Jonesopolis
@Jonesopolis我会尝试将其更改为'for'循环。我摆脱了'foreach'循环只是为了测试它,当我摆脱它时它会回传得很好。我尝试过之后会更新另一条评论。 – maxshuty