2011-02-01 3 views
2

J'essaie de comprendre comment fonctionne ce DropDownListFor mais sans succès.
Mon contrôleur crée une liste de SelectListItems où je mets tous les groupes présents dans la base de données:ASP.NET MVC2: DropDownListFor ne fonctionne pas correctement avec plusieurs sélection + modelbinder

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

ceci il la méthode:

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); 
} 

Comme vous pouvez le voir, je mets l'élément sélectionné s'il sont des groupes associés dans la liste. Je mets cette liste dans un champ (groupes) de mon viewmodel personnalisé:

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

et envoyer UsersViewModel à la vue. J'utilise ce code pour construire un menu déroulant avec plusieurs choix:

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

AssociatedGroups est un champ Utilisateurs de classe (ce qui est un membre de mon viewmodel):

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

Il y a rien de particulier ici. Si j'utilise ce code, je ne peux pas voir les éléments de la liste déroulante sélectionnés (et ils ont l'ensemble d'attributs, j'ai vérifié), mais je peux lier les sélections avec AssociatedGroups lorsque je publie le formulaire. Si je change AssociatedGroups (champ de la classe utilisateur) avec une chaîne:

public String AssociatedGroups { get; set; } 

J'ai le comportement opposé:

je peux voir les éléments du menu déroulant contrôlés mais quand je posterai la forme il n'y a pas liant, ou mieux, un seul élément est lié. J'ai passé la plus grande partie de ma journée à essayer de comprendre le problème et j'ai essayé différentes combinaisons, mais aucune d'entre elles ne semble fonctionner. Y a-t-il quelqu'un qui peut essayer de m'aider?

Merci.

Répondre

3

Vous avez besoin de deux propriétés sur votre modèle de vue: celui qui contiendra les ids de groupes sélectionnés et qui contiendra la liste:

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

et vous utilisez l'assistant ListBoxFor pour permettre des choix multiples:

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

maintenant, en supposant que le modèle de vue suivant est passé à la vue:

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 
    ... 
} 

Ensuite, dans la vue, les deux derniers éléments seront automatiquement présélectionnés.

+0

Merci Darin, C'était utile même si j'ai seulement changé DropDownListFor dans SelectList. J'ai gardé tout le reste comme je l'ai collé et ça marche très bien. Merci. – LeftyX

+0

@vandalo, si cela vous a été utile, vous pourriez peut-être marquer la réponse comme acceptée? –

+0

Désolé Darin, j'ai oublié! – LeftyX

Questions connexes