2017-02-10 5 views
0

Für das Projekt arbeite ich an haben wir Aktionen auf die Dinge an einem Ort durchgeführt, um unsere URL-Muster wie folgt:Globale Aktionsparameter von URL-Präfix

locations/{locationId}/{controller}/{action}/{id} 

So haben wir Maßnahmen Unterschriften wie so:

public ActionResult TheAction(long locationId, long id) 

Was ist gut.

Meine spidey Sinne möchten die Notwendigkeit ausschließen, locationId in der Aktionsparameterliste einzuschließen. Gibt es eine Möglichkeit, diesen Wert über eine Superklasse oder ActionFilter in eine Superklasseneigenschaft zu binden?

Antwort

1

Am einfachsten ist es, den Routenwert locationId zu jeder location Route hinzuzufügen.

routes.MapRoute(
    name: "location1", 
    url: "location1/{controller}/{action}/{id}", 
    defaults: new { locationId = "1", id = UrlParameter.Optional }); 

routes.MapRoute(
    name: "location2", 
    url: "location2/{controller}/{action}/{id}", 
    defaults: new { locationId = "2", id = UrlParameter.Optional }); 

Ihre Standorte Nimmt man die Zahl enthalten, könnten Sie eine regex Route Einschränkung verwenden, um es dynamischer etwas zu machen:

routes.MapRoute(
    name: "location", 
    url: "location{locationId}/{controller}/{action}/{id}", 
    defaults: new { id = UrlParameter.Optional }, 
    constraints: new { locationId = @"\d+" }); 

Oder Sie könnten IRouteConstraint implementieren Ihre Standorte vollständig textbasierte zu machen ohne die ID, die es Ihnen ermöglicht, basierend auf dynamischen Daten zuzuordnen.

Eine weitere Option für datenbankgestützte Daten, mit der Sie mit mehr als einem Segment gleichzeitig arbeiten können, ist ein RouteBase subclass zu erstellen und Ihre Logik dort zu platzieren.

Oder Sie könnten .NET Reflection/Logik-gesteuerte Routen erstellen, die automatisch generiert und zur Routentabelle hinzugefügt werden, wie in this example (beachten Sie jedoch, dass dies nur beim Start der Anwendung erfolgen sollte).

+0

Leider haben wir buchstäblich Tausende von Standorten, so dass Ihr erster Vorschlag nicht skalieren wird. AFAICT die Links scheinen übertrieben, nur um einen zusätzlichen Parameter in der Methode zu vermeiden. Aber danke. –

+0

Ich habe meine Antwort aktualisiert - ich habe zuvor die (viel einfachere) Routenbeschränkung übersehen, die ideal ist, wenn Sie nur ein dynamisches Segment haben möchten. – NightOwl888