【发布时间】:2016-09-13 17:32:51
【问题描述】:
我四处搜索,找不到问题的答案。
我有一个像这样接受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; }
}
【问题讨论】:
-
如果您分享更多关于您绑定到视图/在表单中使用的视图模型的信息,可能会有所帮助
-
当您将
foreach更改为for循环时会发生什么?我很确定这是您的问题,因为这样,默认的模型绑定器无法正确重建您要发布的对象。 See this question作为参考 -
@Jonesopolis 我现在将尝试将其更改为
for循环。我摆脱了foreach循环只是为了测试它,当我摆脱它时它会很好地回发。尝试后我会更新另一条评论。 -
查看你生成的html。
name属性是name="item.Details",而您的Foo模型没有名为item的属性。虽然有一些技巧可以解决这个问题,但您的观点毫无意义,并且是一种令人困惑的用户体验(并且肯定会失去您的客户) - 您生成多个表单,但您只能提交一个表单。 -
使用
for循环或自定义EditorTemplate(参考this answer)但在一个<form>元素内并将方法更改为`public ActionResult AddDetails(Listmodel) 以便所有更改都在一个操作中提交。
标签: c# html asp.net-mvc razor