2016-05-14 4 views
0

Ich versuche, die Art und Weise zu verbessern, in der ich SelectLists in meinem MVC-Modell und meiner View erstellt habe.So weisen Sie einer IEnumerable-Eigenschaft <SelectListItem> in einem Modell einen SelectList-Wert zu

Jemand hat in einer früheren Version meines Codes kommentiert, dass ich zu viele Verwendungen von new hatte. Im Modell, das unten gezeigt wird, sehe ich die Verwendung von new zweimal in der Definition der SelectList. Wie auch immer, ich weiß nicht, wie ich es sonst tun soll, und es ist der einzige Weg, wie ich es in Beispielen definiert habe. Gibt es einen besseren Weg?

In der Modellklasse, ich den Wert SelectList der IEnumerable<StudentRoster> StudentRosters zuweisen, die dann in der Ansicht zugänglich ist.

So erstelle ich die DropDownList in der Ansicht.

<p>Select a campus: @Html.DropDownListFor(m=>m.SelectedCampus,Model.CampusList) 

So definiere ich die SelectList im Modell.

public class SampleViewModel 
{   
    // This IEnumerable is a SelectList in the Html.BeginForm() block 
    public IEnumerable<SelectListItem> CampusList { get; set; } 

    public string SelectedCampus { get; set; }   

    // This list is the "table" shown in the View that the SelectList filters 
    public IEnumerable<StudentRoster> StudentRosters { get; set; }   
} 

Controller:

public ActionResult FilterableIndex(string SelectedCampus="MRA") 
{ 
    StudentRosterViewModel vm = new StudentRosterViewModel(); 

    vm.StudentRosters = db.StudentRosters 
     .Where(m => m.Campus == SelectedCampus)  
     .ToList(); 

    vm.SelectedCampus = SelectedCampus; 
    vm.CampusList = new SelectList(new List<string> 
        {"CRA","DRA","MRA","PRA" }); 

    return View(vm); 
} 

Ist die richtige Codierung oder ist dies ein Beispiel für Kommissionierung eine schlechte Angewohnheit?

+0

Es ist nichts falsch mit der Art und Weise, Sie den 'SelectList' zu erzeugen, sondern eine Eigenschaft' SelectedCampus' aufweist, und dann, um es nicht bindend ist ein bisschen sinnlos. Es sollte nur 'CampusList = new SelectList (neue Liste {" CRA "," DRA "," MRA "," PRA "});' (den letzten Parameter weglassen) und dann in der Ansicht '@ Html.DropDownListFor (m => m.SelectedCampus, Model.CampusList) ' –

+0

Beachten Sie auch, dass Sie einen parameterlosen Konstruktor für Ihr Ansichtsmodell benötigen oder Ihr Code eine Ausnahme auslöst, wenn Sie das Formular absenden. Und in der Regel ist es Ihr Controller, der dafür zuständig sein sollte, die 'SelectList'-Eigenschaft zu füllen, nicht das View-Modell selbst (nicht so wichtig in Ihrem Fall, aber wenn Sie im View-Modell-Konstruktor auf die Datenbank zugreifen würden). –

+0

Hier Ich habe eine Trennung. Wie soll der Controller wissen, welchen Wert ich gewählt habe (indem ich das Formular abschicke) und die Anfrage entsprechend aktualisieren? Die Verwendung von Konstruktorparametern ist die einzige Möglichkeit, die ich bisher gesehen habe. –

Antwort

1

Ihr Ansichtsmodell, geben Sie die Elemente einfach dem Ansichtsmodell, wenn es erstellt wurde, und lassen Sie die SelectListItems daraus generieren. @Rubix_Revenge, das ist die Aufgabe des Controllers.

Wie auch immer, ist dieser carrect Weg

CampusList = new SelectList(new List<string> {"CRA","DRA","MRA","PRA" }); 
+0

Dies beantwortet definitiv die Hauptfrage zur Definition der SelectList. –

Verwandte Themen