2011-05-02 5 views
18

J'ai un problème avec la présélection des éléments dans une liste. J'utilise le moteur de vue de rasoir avec le mvc 3. Je sais qu'il y a quelques messages avec le même problème mais ils ne fonctionnent pas pour moi.Présélectionner des éléments dans Multiselect-Listbox (MVC3 Razor)

code en classe:

public class Foo{ 
    private int _id; 
    private string _name; 

    public string Name{ 
     get{ 
      return _name; 
     } 

    public int Id { 
     get{ 
      return _id; 
     } 

} 

code dans le modèle:

public class FooModel{ 

    private readonly IList<Foo> _selectedFoos; 
    private readonly IList<Foo> _allFoos; 

    public IList<Foo> SelectedFoos{ 
     get{ return _selectedFoos;} 
    } 

    public IList<Foo> AllFoos{ 
     get{ return _allFoos;} 
    } 

} 

code dans cshtml:

@Html.ListBoxFor(model => model.Flatschels, 
     Model.AllFlatschels.Select(fl => new SelectListItem { 
      Text = fl.Name, 
      Value = fl.Id.ToString(), 
      Selected = Model.Flatschels.Any(y => y.Id == fl.Id) 
    }), new {Multiple = "multiple"}) 

j'ai essayé beaucoup d'autres choses, mais rien ne fonctionnait. J'espère que quelqu'un peut aider.

Répondre

31

Je ne peux pas vraiment expliquer pourquoi, mais j'ai réussi à le faire fonctionner. Chacune de ces travaillé:

@Html.ListBoxFor(m => m.SelectedFoos, 
      new MultiSelectList(Model.AllFoos, "ID", "Name"), new {Multiple = "multiple"}) 

@Html.ListBoxFor(m => m.SelectedFoos, Model.AllFoos 
      .Select(f => new SelectListItem { Text = f.Name, Value = f.ID }), 
       new {Multiple = "multiple"}) 

Le problème semble être que la propriété choisie sur SelectListItem est ignorée, et au lieu de la méthode ToString() est appelée, donc si vous devez ajouter à votre classe Foo (!):

public override string ToString() 
{ 
    return this.ID; 
} 

Je devine qu'il a quelque chose à voir avec être en mesure de persister dans les demandes (qui seront aplaties à des chaînes à transmettre sur le fil), mais il est un peu confus!

+0

Merci beaucoup. Je l'ai fait fonctionner. Bien que seulement le deuxième code a fonctionné et il me semble, ce n'est pas à cause du ToString substitué(). Ma propriété Id était un int et j'ai ajouté une clé de propriété retournant une chaîne unique (guid.ToString()). – Tobias

+0

Bizarre. Impossible d'expliquer la chose ToString, mais je suis content que vous l'ayez trié :-) –

+0

C'était définitivement à cause du ToString(). Juste posté une question dans le forum de Microsoft et j'espère obtenir une réponse et peut-être une information pourquoi (et combien de temps) c'est comme ils le sont actuellement. – Tobias

0

Dans MVC5, vous pouvez directement utiliser ListBoxFor avec multiselect. Assurez-vous que lors du chargement de la vue, votre élément sélectionné doit avoir une liste d'éléments.

@Html.ListBoxFor(m => m.SelectedItem, new MultiSelectList(Model.Item.ToList(), "Value", "Text"), new { @class = "form-control" })