MVC 3 MultiSelectList Проводка значений для сложных типов - PullRequest
2 голосов
/ 17 марта 2011

Если у меня сложный тип, например

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 Ответ

2 голосов
/ 11 марта 2013

Ваша модель неверна.У вас должно быть свойство коллекции для привязки выбранных значений.Вы не должны использовать одно и то же свойство для обоих аргументов вашего SelectList.Поэтому начните с добавления свойства в модель представления, в котором будут храниться выбранные идентификаторы:

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 вы получитесвойство SelectedContactTypeIds, содержащее выбранные идентификаторы:

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

Причина, по которой ваш код не работает, заключается в том, что вы связали SelectList со свойством ContactTypes, которое является сложным типом и, как вы знаетеэлемент <select> отправляет только выбранные значения при отправке формы.Вот как работает HTML.

...