使用Entity Framework后端处理MVC Web项目。
我的一个EF对象叫做“Staff”。有一个名为“Team”的独立对象,它们以多对多关系存在,由“TeamMember”表调解。
如果您在数据库中的这些表中创建条目,“Staff”成员最终会为其所属的每个“团队”提供“TeamMember”对象。
在Staff的编辑屏幕中,我选择通过多选列表进行调解。但是,当表单回发到浏览器时,我在这里得到一个以逗号分隔的TeamID值列表,而不是实际对象。显然,我已经把模型绑定搞砸了。
以下是我创建相关表单元素的方法:
<div class="form-group">
@Html.LabelFor(model => model.TeamMembers, new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.ListBoxFor(model => model.TeamMembers, new MultiSelectList(ViewBag.TeamList, "TeamId", "Name", Model.TeamMembers))
</div>
</div>
正在填充ViewBag:
ViewBag.TeamList = db.Teams.ToList();
EF对象与这些属性相互关联:
// on Staff
public virtual ICollection<TeamMember> TeamMembers { get; set; }
// on TeamMember
public int StaffId { get; set; }
public virtual Staff Staff { get; set; }
// on Team
public virtual ICollection<TeamMember> TeamMembers { get; set; }
我在这里做错了什么?
答案 0 :(得分:1)
您无法使用ListBoxFor
方法绑定到复杂模型 - 您必须绑定到某种类型的数组 - 例如string[]
或int[]
以获取所选值。
如前所述,这是使用ViewModel
对象的地方 - 修改数据对象并不是您想要做的事情,而是使用专门用于在UI上显示值的对象
请参阅此处的示例用法:
mvc-5-multiselectlist-selected-values-not-working
根据要求,如果您不想在您的方案中使用VM,只需添加以下属性,确保它不会映射回您的数据库:
public int[] SelectedTeamMembers { get; set; }
并使用以下内容:
@Html.ListBoxFor(model => model.SelectedTeamMembers, new MultiSelectList(ViewBag.TeamList, "TeamId", "Name", Model.TeamMembers))