c# - Obtener múltiples valores seleccionados en Html.DropDownlistFor
asp.net-mvc asp.net-mvc-3 (2)
Para mí también funciona para @Html.DropDownListFor
:
Modelo:
public class MyViewModel
{
public int[] SelectedValues { get; set; }
public IEnumerable<SelectListItem> Values { get; set; }
}
Controlador:
public ActionResult Index()
{
var model = new MyViewModel();
// the list of available values
model.Values = new[]
{
new SelectListItem { Value = "2", Text = "2", Selected = true },
new SelectListItem { Value = "3", Text = "3", Selected = true },
new SelectListItem { Value = "6", Text = "6", Selected = true }
};
return View(model);
}
Maquinilla de afeitar:
@Html.DropDownListFor(m => m.SelectedValues, Model.Values, new { multiple = "true" })
Los SelectedValues enviados en el controlador se ven así:
@Html.DropDownListFor(m => m.branch, CommonMethod.getBranch("",Model.branch), "--Select--", new { @multiple = "multiple" })
@Html.DropDownListFor(m => m.division, CommonMethod.getDivision(Model.branch,Model.division), "--Select--", new { @multiple = "multiple" })
Tengo dos instancias de DropDownListFor. Quiero establecer seleccionado como verdadero para aquellos que han almacenado previamente valores para Model.branch y Model.division. Estas son matrices de cadenas de identificadores almacenados
class CommonMethod
{
public static List<SelectListItem> getDivision(string [] branchid , string [] selected)
{
DBEntities db = new DBEntities();
List<SelectListItem> division = new List<SelectListItem>();
foreach (var b in branchid)
{
var bid = Convert.ToByte(b);
var div = (from d in db.Divisions where d.BranchID == bid select d).ToList();
foreach (var d in div)
{
division.Add(new SelectListItem { Selected = selected.Contains(d.DivisionID.ToString()), Text = d.Description, Value = d.DivisionID.ToString() });
}
}
}
return division;
}
}
El valor devuelto de la división se selecciona como verdadero para el elemento seleccionado en el modelo, pero en el lado de la vista no se selecciona.
Use un ListBoxFor
lugar de DropDownListFor
:
@Html.ListBoxFor(m => m.branch, CommonMethod.getBranch("", Model.branch), "--Select--")
@Html.ListBoxFor(m => m.division, CommonMethod.getDivision(Model.branch, Model.division), "--Select--")
Las propiedades de division
y division
obviamente deben ser colecciones que contendrán los valores seleccionados.
Y un ejemplo completo de la forma correcta de crear un menú desplegable de selección múltiple usando un modelo de vista:
public class MyViewModel
{
public int[] SelectedValues { get; set; }
public IEnumerable<SelectListItem> Values { get; set; }
}
que se llenaría en el controlador:
public ActionResult Index()
{
var model = new MyViewModel();
// preselect items with values 2 and 4
model.SelectedValues = new[] { 2, 4 };
// the list of available values
model.Values = new[]
{
new SelectListItem { Value = "1", Text = "item 1" },
new SelectListItem { Value = "2", Text = "item 2" },
new SelectListItem { Value = "3", Text = "item 3" },
new SelectListItem { Value = "4", Text = "item 4" },
};
return View(model);
}
y en la vista:
@model MyViewModel
...
@Html.ListBoxFor(x => x.SelectedValues, Model.Values)
Es el asistente de HTML que preselecciona automáticamente los elementos cuyos valores coinciden con los de la propiedad SelectedValues
.