MVC - 绑定ICollection属性

时间:2014-11-05 08:41:24

标签: c# asp.net-mvc

我正在使用MVC和EF DB First。我的模型由EF创建。在我的模型中,我有两个ICollection类型属性。

我的问题是当我发布我的表单时,这些属性是空的(我不是发送给他们查看emty)

我的模特:

    public partial class Account
    {
        public Account()
        {
            this.Account_Level = new HashSet<Account_Level>();
            this.Account_Team = new HashSet<Account_Team>();
        }

        public long Id { get; set; }
        public string UserName { get; set; }
        public string Password { get; set; }
        public bool IsAdmin { get; set; }

        public virtual ICollection<Account_Level> Account_Level { get; set; }
        public virtual ICollection<Account_Team> Account_Team { get; set; }
    }

注意:我的ICollection属性在我的视图中不存在,但我需要它们在我的控制器中。

编辑:

我在下面的代码中添加了代码。在我的html中,我可以看到我的Icollection值被添加为隐藏但是当我发布帖子时ICollection属性仍然是空的。所以我仍然没有得到这些价值。

for (int i = 0; i < Model.Account_Level.Count(); i++)
{
    @Html.HiddenFor(m => m.Account_Level.ElementAt(i).AccountId)
    @Html.HiddenFor(m => m.Account_Level.ElementAt(i).Id)
    @Html.HiddenFor(m => m.Account_Level.ElementAt(i).LevelId)
}

for (int i = 0; i < Model.Account_Team.Count(); i++)
{
    @Html.HiddenFor(m => m.Account_Team.ElementAt(i).AccountId)
    @Html.HiddenFor(m => m.Account_Team.ElementAt(i).Id)
    @Html.HiddenFor(m => m.Account_Team.ElementAt(i).TeamId)
}

1 个答案:

答案 0 :(得分:2)

您的代码存在的问题是DefaultModelBinder无法将隐藏字段绑定到您的模型,因为您的隐藏字段未遵循正确的命名约定

Razor视图中的HiddenFor方法生成如下内容:

<input id="AccountId" type="hidden" value="1" name="AccountId" data-val-required="The AccountId field is required." data-val-number="The field AccountId must be a number." data-val="true">

如您所见,生成的名称为AccountId,如果您想使其可绑定,则该名称不正确。

正确的名称必须类似于Account_Level[0].AccountId

以下是隐藏字段正确命名的完整示例:

for (int i = 0; i < Model.Account_Level.Count(); i++)
{
    @Html.HiddenFor(m => m.Account_Level.ElementAt(i).AccountId, new { @Name = string.Format("Account_Level[{0}].AccountId", i) })
    @Html.HiddenFor(m => m.Account_Level.ElementAt(i).Id, new { @Name = string.Format("Account_Level[{0}].Id", i) })
    @Html.HiddenFor(m => m.Account_Level.ElementAt(i).LevelId, new { @Name = string.Format("Account_Level[{0}].LevelId", i) })
}

这将确保默认模型绑定器识别隐藏的字段名称。

在这里,您可以找到有关ASP.NET MVC命名约定的更多信息:

http://haacked.com/archive/2008/10/23/model-binding-to-a-list.aspx/