在ViewModel中绑定IEnumerable不起作用

时间:2017-03-21 10:30:58

标签: asp.net-mvc asp.net-mvc-3 asp.net-mvc-5

我有一个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集合为空。

我做错了什么?如何在页面中隐藏此标记列表,以便模型绑定器可以看到它?

1 个答案:

答案 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.cs​​html:

@model mvcTest.Models.Tag
@Html.HiddenFor(a => a.TagNo)

父视图:

@for (int i = 0; i < @Model.Tags.Count; i++)
{
    @Html.EditorFor(a => a.Tags[i])
}