我四处搜索,找不到我的问题的答案。
我有一个接受 Foo
的 View :
@model IEnumerable<MyApplication.Models.Foo>
在 View 内部我有一张 table 。我填充表格只是通过我的 Foo
模型执行一个简单的 foreach
循环。我添加了一列,用户可以在其中向文本区域中的每一行添加详细信息并保存。
所以 View 看起来像这样:
@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>
}
我的 Controller 是这样设置的:
[HttpPost]
public ActionResult AddDetails(Foo foo)
{
}
当我在该 Controller 上设置断点时,foo
的 Details
属性和 Id
始终具有 null
值> 始终为 0
。当它被传递到 View 中时,它的所有属性都设置为正确的,所以我不确定为什么它没有正确回发?
我已经试过了:
@using (Html.BeginForm("AddDetails", "MyController", FormMethod.Post, new { foo = Model }))
我还尝试删除 foreach
循环并将其更改为仅将单个模型传递给 View ,并让 View 仅接受单个模型而不是 IEnumerable
。当我这样做时,它会很好地回发。
那也行不通。我想知道这是否与我的表单位于 foreach
循环中这一事实有关,也许我需要做更多的工作,比如添加 data-id
将属性添加到元素并捕获按钮上的点击事件并对 Controller 执行 AJAX 调用并沿此方式传递正确的值?
编辑 对不起,我完全忘记了 View 模型。这是它的样子:
public class Foo
{
public int Id { get; set; }
public string Details { get; set; }
}
最佳答案
一般来说,将表单发布到与构成表单 View 的模型不同的模型是不好的。它使很多事情变得困难,其中最重要的是从验证错误中恢复。
您在这里所做的是遍历 Foo
列表并创建多个表单,每个表单将只提交一个 Foo
到一个只需要一个操作的操作富
。虽然帖子本身没问题,但在与您要发布到的模型不同的模型上使用 *For
帮助程序可能不会生成模型绑定(bind)器绑定(bind)已发布内容所需的正确输入名称值到另一个模型上。至少,如果您由于验证错误需要返回到此 View ,您将无法保留用户发布的数据,迫使他们完全重复他们的努力。
理想情况下,您应该发布整个 Foo
列表,并且只有一种包装迭代的形式(在这种情况下,您需要使用 for
而不是foreach
)。或者,您应该简单地列出 Foo
,并附上一个链接以编辑特定的 Foo
,您将拥有一个仅包含一个 Foo
的表单。
关于c# - 在 foreach 循环中形成不将模型发布回 Controller ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39475883/