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).
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. –
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