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 名字选择器
我有一个 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 名字选择器