我有一个ViewModel - 客户。其中有一个IEnumerable集合:
public class Tag
{
public int TagNo{ get; set; }
public DateTime CreatedDate { get; set; }
}
我使用foreach输出标签列表 - 以及标量客户信息:
...output customer info....
<div class="col-md-9">
@{
foreach (var Tag in Model.Tags)
{
@Html.DisplayFor(x => Tag.TagNo);
<br />
}
}
</div>
我试图在模型绑定器的页面中隐藏标记列表,以便在错误时我不需要再次访问数据库:
@{
int[] tagArray = Model.Tags.Select(x => x.TagNo).ToArray();
for (int i = 0; i < Model.Tags.Count(); i++)
{
@Html.Hidden("Tags[" + i + "]", tagArray[i])
}
}
这输出:
<input id="Tags_0_" name="Tags[0]" type="hidden" value="21111111" />
etc
我已经看过各种关于SO的问题,说你可以使用模型绑定器理解绑定列表的某种格式的数组(如上所述) - 例如:
Creating HiddenFor IEnumerable<String> in View
然而,当页面出错并且我使用调试器来查看帖子上绑定的内容时,虽然model.tags看起来有3个元素 - 它们都是空的。
我也试过这个:
@Html.Hidden("Tags[" + i + "].TagNo", tagArray[i])
但发布后,Customer.Tags集合为空。
我做错了什么?如何在页面中隐藏此标记列表,以便模型绑定器可以看到它?
答案 0 :(得分:1)
您的模型属性为IEnumerable<Tag>
,但发布了int[]
后的行。
你需要改变
@{
int[] tagArray = Model.Tags.Select(x => x.TagNo).ToArray();
for (int i = 0; i < Model.Tags.Count(); i++)
{
@Html.Hidden("Tags[" + i + "]", tagArray[i])
}
}
到
@for (int i = 0; i < @Model.Tags.Count; i++)
{
<input id="Tags_@(i)__TagNo" name="Tags[@i].TagNo" type="hidden" value="@Model.Tags[i].TagNo" />
}
我建议在这种情况下使用编辑器模板
\ Views \ Shared \ EditorTemplates \ Tag.cshtml:
@model mvcTest.Models.Tag
@Html.HiddenFor(a => a.TagNo)
父视图:
@for (int i = 0; i < @Model.Tags.Count; i++)
{
@Html.EditorFor(a => a.Tags[i])
}