c#MVC帖子没有填充视图模型

gil*_*rpa -1 c# asp.net-mvc asp.net-mvc-4

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

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

    public int DivisionId { get; set; }

    public string Name { get; set; }

}
Run Code Online (Sandbox Code Playgroud)

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

<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>
Run Code Online (Sandbox Code Playgroud)

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

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

我错过了什么?

小智 5

模型绑定失败的最常见原因是name输入的属性与模型中属性的名称不匹配,首先应该检查代码实际生成的html.假设DivisionId第一项中的值是1,您生成的是

<input name="1" type="hidden" value="{ @name = Divisions[0].DivisionId, @id = "Divisions_0__.DivisionId }" />
Run Code Online (Sandbox Code Playgroud)

这与您的模型没有任何关系.

  • 第一个参数是要绑定的属性,并且您告诉它绑定到一个名为的属性1- 结果Model.Divisions[i].DivisionId.ToString(),它不存在,并且无论如何都是非法的
  • 第二个参数@Html.Hidden()value属性,所以你告诉它使用你的匿名对象作为值
  • 即使您添加了第二个参数(以便从匿名对象生成html属性),它仍然无法工作,因为 @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)
}
Run Code Online (Sandbox Code Playgroud)

并且将生成正确的名称和值属性以绑定到您的集合.

话虽如此,你所拥有的只是隐藏的输入,所以生成所有额外的html,将它发送到浏览器并将其全部重新发送回来没有任何意义.如果您在POST方法中需要该集合,那么只需从您的存储库中获取它.

作为旁注,你new { @id = ".." }没有意义.添加id属性的目的是在css和javascript/jquery选择器中使用,这对于集合项没有意义,但在任何情况下都不起作用,因为你有一个.(点)作为类名选择器