c# - 在 foreach 循环中形成不将模型发布回 Controller

标签 c# html asp.net-mvc razor

我四处搜索,找不到我的问题的答案。

我有一个接受 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 上设置断点时,fooDetails 属性和 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/

相关文章:

c# - 在我的应用程序中禁用系统字体大小效果

c# - 为什么一路往下用Async/await

html - 针对同一父级别中特定元素的第一个子元素

html - 为什么浏览器不渲染它加载的一些 CSS?

javascript - 使用javascript来增加分数

c# - 在 visual studio 上使用 c#、mvc 管理我的用户

c# - CCI vs. Mono.Cecil——优点和缺点

asp.net-mvc - 如何在 View 上下文之外获取 ModelMetadata?

asp.net-mvc - MVC 模型绑定(bind)在模型上保留复杂的属性

asp.net-mvc - 如何在 mvc 中更新 IEnumerable<Object>?