web-dev-qa-db-fra.com

Obtention de plusieurs valeurs sélectionnées dans Html.DropDownlistFor

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

J'ai deux instances de DropDownListFor. Je veux définir sélectionné comme vrai pour ceux qui ont déjà stocké des valeurs pour Model.branch et Model.division. Ce sont des tableaux de chaînes d'ID stockés

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

La valeur de division renvoyée est sélectionnée comme vraie pour l'élément sélectionné dans le modèle, mais côté vue, elle n'est pas sélectionnée.

30
user

Utilisez un ListBoxFor au lieu de DropDownListFor:

@Html.ListBoxFor(m => m.branch, CommonMethod.getBranch("", Model.branch), "--Select--")

@Html.ListBoxFor(m => m.division, CommonMethod.getDivision(Model.branch, Model.division), "--Select--")

Les propriétés branch et division doivent évidemment être des collections qui contiendront les valeurs sélectionnées.

Et un exemple complet de la bonne façon de créer une liste déroulante de sélection multiple à l'aide d'un modèle de vue:

public class MyViewModel
{
    public int[] SelectedValues { get; set; }
    public IEnumerable<SelectListItem> Values { get; set; }
}

qui serait rempli dans le contrôleur:

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

et dans la vue:

@model MyViewModel
...
@Html.ListBoxFor(x => x.SelectedValues, Model.Values)

C'est l'aide HTML qui présélectionnera automatiquement les éléments dont les valeurs correspondent à celles de la propriété SelectedValues.

57
Darin Dimitrov

Pour moi, cela fonctionne aussi pour @Html.DropDownListFor:

Modèle:

public class MyViewModel
{
    public int[] SelectedValues { get; set; }
    public IEnumerable<SelectListItem> Values { get; set; }
}

Contrôleur:

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

Rasoir:

@Html.DropDownListFor(m => m.SelectedValues, Model.Values, new { multiple = "true" })

Les valeurs sélectionnées soumises dans le contrôleur ressemblent à:

enter image description hereenter image description here

12
tonco