values net mvc multiselectlist multiselect multiple dropdownlist combo asp .net asp.net-mvc asp.net-mvc-3 razor

.net - net - Preseleccionar elementos en el cuadro de lista Multiselect(MVC3 Razor)



multiselectlist (2)

Tengo un problema con la preselección de elementos en un cuadro de lista. Estoy usando el motor razor view con mvc 3. Sé que hay algunas publicaciones con el mismo problema, pero no funcionan para mí.

Código en clase:

public class Foo{ private int _id; private string _name; public string Name{ get{ return _name; } public int Id { get{ return _id; } }

Código en Modelo:

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

Código en 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"})

Probé muchas otras cosas pero nada funcionó. Espero que alguien pueda ayudar.


En MVC5 puedes usar directamente ListBoxFor con multiselect. Asegúrese de que mientras carga la vista, su artículo seleccionado debería tener una lista de elementos.

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


Realmente no puedo explicar por qué, pero logré que funcionara. Cualquiera de estos funcionó:

@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"})

El problema parece ser que la propiedad seleccionada en SelectListItem se ignora, y en su lugar se ToString() al ToString() (!), Así que si necesita agregar esto a su clase de Foo :

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

Supongo que tiene algo que ver con ser capaz de persistir en las solicitudes (que se aplanarán a las cadenas que se pasarán por el cable), ¡pero es un poco confuso!