Obtenir plusieurs valeurs sélectionnées en 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 selected comme true pour ceux qui ont précédemment stocké des valeurs pour le modèle.direction générale et le Modèle.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 renvoyée de division est sélectionnée comme true pour l'élément sélectionné dans le modèle, mais du côté de la vue, elle n'est pas sélectionnée.

23
demandé sur numaroth 2012-08-29 15:19:53

2 réponses

Utiliser 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 contenant les valeurs sélectionnées.

Et un exemple complet de la manière appropriée de construire une liste déroulante de sélection multiple en utilisant 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'Assistant HTML qui présélectionnera automatiquement les éléments dont les valeurs correspondent à celles de la propriété SelectedValues.

48
répondu Darin Dimitrov 2012-08-29 11:40:54

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

Soumis SelectedValues dans le contrôleur ressemble:

entrez la description de l'image ici entrez la description de l'image ici

10
répondu tonco 2015-12-02 14:45:37