为什么我的MultiSelectList没有将数据返回到模型?

时间:2016-09-30 14:39:48

标签: c# asp.net-mvc linq asp.net-mvc-3 asp.net-mvc-4

我有以下视图模型:

public class SendGroupEmailViewModel
{
    public int EmailID { get; set; }
    public IEnumerable<SelectListItem> Roles { get; set; }
    public int[] SelectedRoles { get; set; }

}

将适当信息发送到视图的控制器操作:

var viewModel = new SendGroupEmailViewModel
        {
            Roles = db.Roles.OrderBy(r => r.Name).ToList().Select(rr => new SelectListItem { Value = rr.Id.ToString(), Text = rr.Name }).ToList(),

        };

然后在我看来:

@Html.ListBoxFor(model => model.SelectedRoles, new MultiSelectList(Model.Roles, "Value", "Text"), new { @class = "" })

列表在视图中正确显示,但当发布带有上述ListBoxFor的表单时,SelectedRoles返回null。

任何人都可以告诉我为什么会这样,以及如何补救它?

1 个答案:

答案 0 :(得分:1)

您的代码看起来很好。这不会起作用的唯一原因是因为SELECT元素的选项值不是数字类型(EX:Guid / String)。在这种情况下,模型绑定器将无法将非数值值数组绑定到int数组类型(这是SelectedRoles属性的类型)。

解决方案是将SelectedRoles的类型更改为类型集合,该集合是Id实体中Role属性的类型。

假设您的Role.Id属于string类型,这应解决问题

public class SendGroupEmailViewModel
{
    public int EmailID { get; set; }
    public IEnumerable<SelectListItem> Roles { get; set; }
    public string [] SelectedRoles { get; set; }
}

此外,您无需再次在视图中创建MultiSelectList的对象。你可以简单地做

@Html.ListBoxFor(model => model.SelectedRoles, Model.Roles, new { @class = "" })