我正在使用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)
}
答案 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/