复杂类型的MVC 3 MultiSelectList过帐值

时间:2011-03-17 19:19:24

标签: forms asp.net-mvc-3 complextype multi-select

如果我有复杂的类型,例如

public class Customer
{
   public int Id {get;set;}
   public List<ContactType> ContactTypes {get;set;}
}

public class ContactType
{
   public int Id {get;set;}
   public string Name {get;set;}
}

我的强类型视图绑定ContactType就像这样......

 @Html.ListBoxFor(m => m.ContactTypes , 
                  new MultiSelectList(ViewBag.ContactTypes, "Id", "Name"))

我的行动方法签名是......

public ActionResult Create(Customer customer){}

为什么发布表单时customer.ContactTypes为空?我可以看到发布的数据 就像ContactTypes=1&ContactTypes=2一样,我虽然会绑定到ContactTypes

有人能指出我正确的方向吗?

1 个答案:

答案 0 :(得分:2)

你的模特错了。您应该有一个集合属性来绑定选定的值。您不应对SelectList的两个参数使用相同的属性。首先,在视图模型上添加一个属性来保存选定的ID:

public class Customer
{
    public int Id { get; set; }

    public List<int> SelectedContactTypeIds { get; set; }
    public List<ContactType> ContactTypes { get; set; }
}

然后修正您的观点:

@Html.ListBoxFor(
    m => m.SelectedContactTypeIds, 
    new MultiSelectList(Model.ContactTypes, "Id", "Name")
)

现在,在您的Create操作中,您将获得包含所选ID的SelectedContactTypeIds属性:

public ActionResult Create(Customer customer)
{
    // here the customer.SelectedContactTypeIds will contain the ids of the selected items
    ...
}

您的代码不起作用的原因是您将SelectList绑定到ContactTypes属性,这是一个复杂类型,并且您知道<select>元素仅发送选定的值表格已提交。这就是HTML的工作方式。