c# MVC post 未填充视图模型

c# MVC post not populating view model

我有一个 ViewModel,它有一个 属性 定义为 Division 类型的 IList。 Division对象如下:

public class DivisionViewModel :
{
    public int Id { get; set; }

    public int DivisionId { get; set; }

    public string Name { get; set; }

}

过去,我刚刚在视图中创建了以下内容:

<div class="divisions">
    @for (int i = 0; i < Model.Divisions.Count(); i++)
    {
        @Html.Hidden(Model.Divisions[i].DivisionId.ToString(), new { @name = "Divisions[" + i + "].DivisionId", @id = "Divisions_" + i + "__.DivisionId" })
        @Html.Hidden(Model.Divisions[i].Id.ToString(), new { @name = "Divisions[" + i + "].Id", @id = "Divisions_" + i + "__.Id" })
        @Html.Hidden(Model.Divisions[i].Name, new { @name = "Divisions[" + i + "].Name", @id = "Divisions_" + i + "__.Name" })
    }
</div>

当我提交页面时,在检查返回的 ViewModel 时,我发现 DivisionId 已填充,但 Id 和 Name 属性 都没有。

我已经注释掉了设置 DivisionId 的行,但是仍然返回没有 Id 和 Name 属性

我错过了什么?

模型绑定失败的最常见原因是输入的 name 属性与模型中属性的名称不匹配,您应该始终做的第一件事是检查 html 您的代码实际上正在生成。假设第一项中DivisionId的值为1,你生成的是

<input name="1" type="hidden" value="{ @name = Divisions[0].DivisionId, @id = "Divisions_0__.DivisionId }" />

这与您的模型无关。

  • 第一个参数是要绑定的属性,你告诉它 绑定到名为 1 的 属性 - Model.Divisions[i].DivisionId.ToString() 的结果,它不存在并且是非法的 无论如何
  • @Html.Hidden()的第二个参数是属性的value, 所以你告诉它使用你的匿名 object 作为值
  • 即使您添加了第二个参数(以便 html 属性 将从匿名 object 生成),它仍然无法工作,因为使用 @name="..."幸运的是什么都不做-使用的目的 HtmlHelper 方法是正确绑定到您的模型)

只需使用

@for (int i = 0; i < Model.Divisions.Count; i++)
{
    @Html.HiddenFor(m => m.Divisions[i].DivisionId)
    @Html.HiddenFor(m => m.Divisions[i].Id)
    @Html.HiddenFor(m => m.Divisions[i].Name)
}

并且将生成正确的名称和值属性以绑定到您的 collection。

话虽如此,您所拥有的只是隐藏的输入,因此生成所有额外的 html、将其发送到浏览器并原封不动地再次发送回去是没有意义的。如果您在 POST 方法中需要 collection,那么只需从您的存储库中获取它即可。

作为旁注,您的 new { @id = ".." } 毫无意义。添加 id 属性的目的是为了在 css 和 javascript/jquery 选择器中使用,这对 collection 项目没有真正意义,但在任何情况下都不起作用,因为你有一个 .(点)可以作为 class 名字选择器