2017-04-26 4 views
0

Ich habe eine Controller-Aktion, die eine Liste von Aktivitäten an eine Ansicht zurückgibt. (eventID, Venue, Raum, EventDescription, EventType, StartDateTime, EndDateTime). Der Anwender wollte nach Ort filtern können, so dass ich Venue als ID die MethodeMehrere optionale Parameter an die Controller-Aktion übergeben

Aktion hinzugefügt
ActionResult ListEvents(id string) 
{ 
    ... Get the relevant details and return the view with the model 
} 

nun auch durch jeden/alle Ereignistypen, Start, Ende, ob Post filtern sie wollen in der Lage sein - Die Ereignisdaten wurden vervollständigt.

Bin ich besser fügen Sie diese als GET-Abfrage-Parameter oder eine benutzerdefinierte Route zu definieren, die alle 5 Argumente akzeptieren oder gibt es eine andere Lösung

ich auch hinzufügen müssen sortieren und Paginierung an einem gewissen Punkt, falls dieser ändert den Vorschlag.

Antwort

1

Normalerweise würden diese über eine Abfragezeichenfolge behandelt werden, aber es spielt keine Rolle, wie Sie es wirklich tun. Unabhängig davon, wie die Parameter gesendet werden, muss Ihre Aktion alle akzeptieren. Das einzige, was Sie beachten müssen, ist die Standard-C# -Methodenregel (da Aktionen nur Methoden sind), dass optionale Parameter die letzten auf der Methode sein müssen. Wenn sie alle optional sind, dann ist auch das nicht wirklich ein Anliegen.

Grundsätzlich müssen Sie nur so etwas wie:

public ActionResult ListEvents(string id = null, int? eventID = null, ...) 
{ 

Dann innen, dann würden Sie nur so etwas wie:

var events = db.Events; 

if (eventID.HasValue) 
{ 
    events = events.Where(m => m.EventID == eventId); 
} 

// rinse and repeat for each filter 
+0

Dank Chris, fühlt sich wie es mit dem Sein abstrahiert tun könnte. Ist es möglich, die GET-Parameter als einzelnes Array zu lesen und die Array-Elemente zu durchlaufen, um festzustellen, ob sie den Modelleigenschaften entsprechen? –

+0

Nein und nein. Sie könnten ein Ansichtsmodell erstellen, das alle diese Parameter als Eigenschaften akzeptiert und stattdessen an diese bindet, aber Sie müssen trotzdem überprüfen, ob jedes Element festgelegt ist, und entsprechend nacheinander filtern. Die einzige andere Möglichkeit ist die Verwendung von Reflektion, aber das ist nicht nur langsam, sondern funktioniert möglicherweise nicht einmal in Verbindung mit EF, da Klauseln in SQL übersetzt werden müssen. –

Verwandte Themen