Как правильно создать MultiSelect <select> с помощью помощника DropdownList?

(извините, здесь есть несколько элементов, но никто, кажется, не позволяет мне работать.)

Я хочу создать DropDownList, который допускает множественный выбор. Я могу заполнить список, но я не могу заставить текущие выбранные значения работать.

В моем контроллере есть следующее:

ViewBag.PropertyGroups = from g in db.eFinGroups
                              where g.GroupType.Contents == "P"
                              select new
                              {
                                  Key = g.Key,
                                  Value = g.Description,
                                  Selected = true
                              };

ViewBag.SelectedPropertyGroups = from g in company.Entities .First().Properties.First().PropertyGroups select new { g.eFinGroup.Key, Value = g.eFinGroup.Description };

В представлении у меня есть:

@Html.DropDownListFor(model => model.PropertyGroupsX, 
   new MultiSelectList(ViewBag.PropertyGroups
             , "Key", "Value"
             , ViewBag.SelectedPropertyGroups), 
new { @class = "chzn-select", data_placeholder = "Choose a Property Group", multiple = "multiple", style = "width:350px;" })

PropertyGroupX - это строка [] в модели.

Я пробовал все типы итераций с выбранными свойствами... передавая только значение, просто ключ, оба и т.д.

Кроме того, какой тип должен быть PropertyGroupX? Правильно ли строковый массив? Или это словарь, содержащий текущие классы свойств? Мне действительно трудно найти документ об этом.

Кто-то предложил мне использовать ListBoxFor. Я изменил это и все еще имею ту же проблему. Выбранные значения не будут выбраны, если выбраны теги параметров. Вот что я пробовал:

@Html.ListBoxFor(model = > model.PropertyGroups, новый MultiSelectList (ViewBag.PropertyGroups, "Key", "Value" ))

Я попробовал model.PropertyGroups как набор строк, соответствующих значениям, как набор рекомендаций, соответствующих этим идентификаторам, и как анонимный тип с ключом и значением для соответствия элементам в ViewBag. Кажется, что ничего не работает.

Ответ 1

Вы не используете DropDownListFor, если хотите создать список мультиселектов. Вы используете помощник ListBoxFor.

Просмотр модели:

public class MyViewModel
{
    public string[] SelectedIds { get; set; }
    public IEnumerable<SelectListItem> Items { get; set; }
}

Контроллер:

public ActionResult Index()
{
    var model = new MyViewModel
    {
        // preselect the first and the third item given their ids
        SelectedIds = new[] { "1", "3" }, 

        // fetch the items from some data source
        Items = Enumerable.Range(1, 5).Select(x => new SelectListItem
        {
            Value = x.ToString(),
            Text = "item " + x
        })
    };
    return View(model);
}

Вид:

@model MyViewModel
@Html.ListBoxFor(x => x.SelectedIds, Model.Items)