2016-04-02 8 views
0

In der Ansicht, ichPreselection für ListBox in ASP.Net MVC4 festlegen?

<div class="form-group"> 
    <div> 
     @Html.LabelFor(m => m.DoctorList, new { @class = "control-label" }) 
    </div> 
    <div> 
     @Html.ListBoxFor(m => m.DoctorList, new MultiSelectList((List<SelectListItem>)ViewBag.DoctorList, "Value", "Text", ((List<string>)(ViewBag.DoctorsSelected)).ToArray()), new {style="display:block;height:20.0em;", @class = "form-control", Multiple = "multiple"}) 

    </div> 
</div> 

DoctorList eine Liste in Modell ist, ist ViewBag.DoctorList die gesamte Liste der Ärzte, sie sind so etwas wie:

public static List<SelectListItem> GetDoctorList() 
{ 
    List<SelectListItem> ret = new List<SelectListItem>(); 

    // load doctors from database 
    // for now, fake data 
    for (int k = 1; k <= 30; k++) 
    { 
     string n = "Doctor" + k.ToString(); 
     ret.Add(new SelectListItem() { Value = n, Text = n }); 
    } 
    return ret; 
} 

ViewBag.DoctorsSelected ist ein Liste, die eine Liste der Arzt Namen ist, etwas ähnliches wie:

List<string> doctorsSelected = new List<string>(); 
doctorsSelected.Add("Doctor1"); 
doctorsSelected.Add("Doctor5"); 

Was möchte ich tun, ist, dass die Ärzte in der Listbox vorzuwählen. Es zeigt jedoch immer die Listbox, aber keine Neuauswahl.

Ich habe auch versucht unten in GetDoctorList()

ret.Add(new SelectListItem() { Value = n, Text = n, Select = true }); 

Immer noch keine Vorwahl zu verwenden.

Wer weiß, wie es geht? Ich benutze MVC4.

Dank

Antwort

2

Sie können nicht den gleichen Namen für die Eigenschaft auf Ihre Bindung und die SelectList verwenden. Ihr Modell sollte eine Eigenschaft haben (sagen wir)

public IEnumerable<string> SelectedDoctors { get; set; } 

und der Blick wird

@Html.ListBoxFor(m => m.SelectedDoctors, (IEnumerable<SelectListItem>)ViewBag.DoctorList) 

werden, wenn SelectedDoctors Werte enthält, die die Werte in der SelectList übereinstimmen, dann werden diese Elemente ausgewählt werden, wenn die Aussicht ist gerendert Zum Beispiel in der Steuerung,

model.SelectedDoctors = new List<string> { "Doctor1", "Doctor5" }; 
return View(model); 

Beachten Sie auch, dass ViewBag.DoctorList ist bereits IEnumerable<SelectListItem> so dass sie nur sinnlos zusätzlicher Aufwand eine identisches neues IEnumerable<SelectListItem> erstellen daraus new SelectList() Ihre Ansicht verwenden.

bearbeiten (als Antwort auf OP-Abfrage, warum die Namen unterschiedlich sein müssen)

Die Art und Weise der ListBoxFor() Werke

  1. den Wert der Immobilie, um Ihre Bindung von den ViewDataDictionary (in Ihrem Fall ist der Artikel in der ViewDataDictionary ist).
  2. Bauen Sie ein neueIEnumerable<SelectListItem> vom SelectList im zweiten Parameter zur Verfügung gestellt (um die Selected Eigenschaft jedes SelectListItem basierend auf den Werten zu setzen Ihre Bindung an).
  3. Generieren Sie den HTML-Code für jedes <option> Element auf der Grundlage der Value, Text und Selected Eigenschaften jedes SelectListItem.

In Ihrem Fall, da jeder SelectListItem erstellt wird, dessen überprüft, ob alle Werte in der Eigenschaft auf Ihrer Bindung passen die Value Eigenschaft des SelectList, aber Ihre Werte "System.Web.Mvc.SelectListItem" sind (sie sind komplexe Objekte so der .ToString() Wert von das Objekt verwendet wird) und keine Ihrer SelectListItems einen Wert von "System.Web.Mvc.SelectListItem" haben (nur "Doctor1“, "Doctor2" etc.), so dass die Selected Eigenschaft ist false und folglich keine der <option> Elemente haben die selected="selected" Attribut gesetzt.

Das obige ist eine vereinfachte Erklärung und wenn Sie sehen möchten, wie alles funktioniert, können Sie view/download the source code here.

+0

Nun, Sie haben Recht, "Sie können nicht den gleichen Namen für die Eigenschaft verwenden, die Sie binden und die SelectList". Aber warum? – urlreader

+0

Das dauert etwa eine Seite oder 2, um im Detail zu erklären :) - aber ich sehe, ob ich später eine vereinfachte Erklärung hinzufügen kann (brauchen eine Pause für eine Stunde oder 2) –

+0

Siehe Update für eine Erklärung, warum die gleichen Namen haben arbeite nicht. –