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属性,所以你告诉它使用你的匿名对象作为值@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选择器中使用,这对于集合项没有意义,但在任何情况下都不起作用,因为你有一个.(点)作为类名选择器
| 归档时间: |
|
| 查看次数: |
290 次 |
| 最近记录: |