MVC模型绑定返回Id列表而不是对象

时间:2015-09-18 15:03:28

标签: c# asp.net-mvc entity-framework

使用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; }

我在这里做错了什么?

1 个答案:

答案 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))