ASP.NET MVC2: DropDownListFor не работает должным образом с множественным выбором + связыватель модели - PullRequest
2 голосов
/ 01 февраля 2011

Я пытаюсь выяснить, как работает DropDownListFor, но безуспешно.
Мой контроллер создает список SelectListItems, куда я помещаю все группы, найденные в базе данных:

viewModel.Groups = LoadGroups(viewModel.User.AssociatedGroups);

this itметод:

private IList<SelectListItem> LoadGroups(List<String> associatedGroups)
{
    var groups = _SecurityService
            .LoadGroups()
            .Select(e => new SelectListItem
            {
                Selected = associatedGroups.Contains<System.String>(e.Id.ToString()),
                Value = e.Id.ToString(),
                Text = e.Name
            }).ToList();
    return (groups);
} 

Как видите, я установил выбранный элемент, если в списке есть связанные группы.Я помещаю этот список в поле (Группы) моей пользовательской модели представления:

   public class UsersViewModel
    {
        public UsersViewModel()
        {
            this.Groups = new List<SelectListItem>();
        }
        public Models.User User { get; set; }
        public IList<SelectListItem> Groups { get; set; }
    }

и отправляю UsersViewModel в представление.Я использую этот код для построения выпадающего списка с множественным выбором:

<%=Html.DropDownListFor(m => m.User.AssociatedGroups, (List<System.Web.Mvc.SelectListItem>)Model.Groups, new { @class = "dropDownGroups", multiple = "multiple" })%>

AssociatedGroups - это поле класса Users (который является членом моей модели представления):

public List<String> AssociatedGroups { get; set; }

Там нет ничегосвоеобразный здесь.Если я использую этот код, я не могу увидеть элементы выбранного раскрывающегося списка (и у них установлен атрибут, я дважды проверил), но я могу связать выборки с AssociatedGroups, когда я публикую форму.Если я изменяю AssociatedGroups (поле класса User) на строку:

public String AssociatedGroups { get; set; }

У меня будет противоположное поведение:

Я вижу проверенные элементы раскрывающегося списка, но когда я публикуюЕсли нет привязки, или, что лучше, связан только один элемент.Я провел большую часть своего дня, пытаясь выяснить, в чем проблема, и я пробовал разные комбинации, но ни одна из них, похоже, не работает.Кто-нибудь может мне помочь?

Спасибо.

1 Ответ

3 голосов
/ 01 февраля 2011

Вам нужно два свойства в вашей модели представления: одно, которое будет содержать идентификаторы выбранной группы, и другое, которое будет содержать список:

public class UsersViewModel
{
    public IEnumerable<SelectListItem> Groups { get; set; }
    public IEnumerable<string> SelectedGroupIds { get; set; }
}

, а затем вы будете использовать помощник ListBoxFor, чтобымножественный выбор:

<%= Html.ListBoxFor(
    m => m.SelectedGroupIds, 
    new SelectList(Model.Groups, "Value", "Text"), 
    new { @class = "dropDownGroups" }
) %>

Теперь предположим, что следующая модель представления передается в представление:

public ActionResult Index()
{
    var model = new UsersViewModel
    {
        // TODO: Use a repository to fetch those values 
        // and map them to the view model
        Groups = new[] 
        {
            new SelectListItem { Value = "1", Text = "group 1" },
            new SelectListItem { Value = "2", Text = "group 2" },
            new SelectListItem { Value = "3", Text = "group 3" },
        },
        // We want to preselect the last two groups in the listbox
        SelectedGroupIds = new[] { "2", "3" }
    };
    return View(model);
}

[HttpPost]
public ActionResult Index(IEnumerable<string> selectedGroupIds)
{
    // Here we will get the list of selected ids
    // when the form containing the listbox is
    // submitted
    ...
}

Затем на представлении два последних элемента будут автоматически предварительно выбраны.

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