2017-05-09 5 views
2

Ich habe gekämpft, um eine MultiSelectList von HTML-Helper an ein bestimmtes Modell zu binden.Bindig ListBox Auswahl zu Modelleigenschaften

Modell
In meinem Modell habe ich so etwas wie dieses:

public class DefaultSelection 
{ 
    public SelectionItem Selection1 {get;set;} 
    public SelectionItem Selection2 {get;set;} 
    public SelectionItem Selection3 {get;set;} 

    public IEnumerable<SelectionItem> Items{get;set;} 

    public DefaultSelection() 
    { 
     Selection1 = new SelectionItem(true, "Item1"); 
     Selection2 = new SelectionItem(false, "Item2"); 
     Selection3 = new SelectionItem(true, "Item3"); 
     Items = new List<SelectionItem>(new SelectionItem[] 
             {Selection1,Selection2,Selection3}); 
    } 
} 

public class SelectionItem 
{ 
    public bool Selected {get;set;} 
    public string Name {get;set;} 

    public SelectionItem(bool selected, string name) 
    { 
     Selected = selected; 
     Name = name; 
    } 
} 

Was ich tun möchte, ist meine ListBox Auswahl an Ausgewählte Eigenschaft eines SelectionItem verbindlich.
Ich habe versucht, dies in meiner Ansicht:

@Html.ListBoxFor(model => model.Items, new MultiSelectList(Model.Items, Model.Items.Where(item => item.Selected)), new { @class = "selectpicker" }) 

Unfortunatly weder die ausgewählten Elemente werden korrekt angezeigt (nichts ausgewählt ist) noch eine Auswahl hat keine Auswirkungen auf das Modell ...

Gibt es eine Weg, um das zu lösen?
Kann ich diese Artikel Eigenschaft loswerden, denn es ist nur ein Verweis auf die benötigten Eigenschaften?

+0

siehe diese http://stackoverflow.com/a/18363359/4868839 – User3250

+0

Mögliche Duplikat von [Super einfache Implementierung der Multiselect-Listbox in Bearbeiten-Ansicht] (http://stackoverflow.com/questions/18363158/super- simple-implementation-of-multiselect-list-box-in-edit-view) – User3250

Antwort

0

Ich denke, es ist viel einfacher als Sie denken. Lass es uns versuchen.

erstellen eine gute Sicht Modell:

public class DefaultSelection 
{ 
    public IEnumerable<SelectListItem> Items { get; set; } 

    //Set a property to hold the selected items IDs. 
    public IEnumerable<string> SelectedItems { get; set; } 

    public DefaultSelection() 
    { 
     //preselected features 
     Items = new List<SelectListItem> 
     { 
      new SelectListItem { Text = "Item1", Selected = true}, 
      new SelectListItem { Text = "Item2", Selected = false}, 
      new SelectListItem { Text = "Item3", Selected = true} 
     }; 
    } 
} 

die List-Box in der Ansicht Render:

<div class="form-group"> 
    @Html.LabelFor(x => x.Items) 
    @Html.ListBoxFor(x => x.SelectedItems, Model.Items, new { @class = "selectpicker" }) 
</div> 

Bitte beachte, dass ich hier mit dem eingebauten in System.Web.Mvc.SelectListItem Klasse statt Ihrer eigenen SelectionItem - Sie können sicher loswerden es.

Jetzt erhalten Sie die ausgewählten Artikel IDs (in diesem Fall der Name, weil Sie keine Wert -Eigenschaft beim Erstellen der Elemente angegeben) in Ihrem Modell nach der Buchung.

Hoffe, das hilft!

+1

Gut für mich gearbeitet! Vielen Dank! – monsterripper

0

Ihre @Html.ListBoxFor sollte wie sein diese

@Html.ListBoxFor(model => model.SelectedNames, new MultiSelectList(Model.Items,"Name", "Name",Model.Items.Where(x=>x.Selected).Select(x=>x.Name)), new { @class = "selectpicker" }) 

Sie haben Value field und Text field von Model.Items zu spezifizieren, die "Name", "Name" und Model.Items.Where(x=>x.Selected).Select(x=>x.Name) ist werden alle Werte auswählen, wo ausgewählt ist true aber Ihr Modell werden die Werte in der Liste zurückzukehren von Zeichenfolge, so dass Sie ein Feld definieren sollten

wo Sie die Werte des ausgewählten erhalten Artikel

Verwandte Themen