Asp.Net MVC Routing - wie kann ich die ganze URL überein?
-
06-07-2019 - |
Frage
Ich versuche, eine Catch-all-Route erstellen zu verfolgen, wenn ein Affiliate-String in der URL ist. Ein affilite Code wird von einem x
von einem int
gefolgt markiert und wird erst am Ende einer URL (aber vor dem Abfrage-String) erscheinen.
Die Idee ist, dass ich den Partner-ID zu extrahieren, einige Protokollierung tun, dann ein 301 auf die gleiche Anfrage ohne den Partner-ID.
Zum Beispiel:
http://www.domain.com/x32
http://www.domain.com/x32/
http://www.domain.com/path/to/something/x32
http://www.domain.com/x32?query=string
http://www.domain.com/x32/?query=string
http://www.domain.com/path/to/something/x32?query=string
http://www.domain.com/path/to/something/x32/?query=string
Ich habe diese Route
routes.Add(new Route("{url}/x{affiliateExternalId}", new MvcRouteHandler())
{
Defaults = new RouteValueDictionary(
new { controller = "Home", action = "LogCookieAndRedirect" }
),
Constraints = new RouteValueDictionary(new { affiliateExternalId = @"\d{1,6}" })
});
Welche nur Spiele
http://www.domain.com/path/x32
http://www.domain.com/path/x32/
Was muss ich tun, alles passen und die Query-String an die Steuerung übergeben? Es gibt einen *
Operator, ich vermute, ich sollte, aber ich kann es nicht bekommen, was ich brauche.
Lösung
{*url}
wird den gesamten Weg entspricht und nicht nur ein Segment. Da es jedoch den ganzen Weg übereinstimmt, können Sie dann nicht die am Ende des Partner-ID übereinstimmen. Die Route wird jede Anfrage entsprechen. Sie können rund um das erhalten, indem eine Route Einschränkung hinzu, dass url
zu überprüfen, einen Affiliate-ID am Ende hat:
routes.MapRoute(
"WithAffiliate",
"{*url}",
new { controller="Home", action="LogCookieAndRedirect" },
new { url = @"/x[0-9]+$" }
);
Ihre Aktion wird dann müssen die Partner-ID aus dem url
Parameter selbst analysieren. Wenn Sie die Möglichkeit, die URL-Struktur zu ändern, wäre es möglich, die ID übereinstimmen, wenn es am Anfang des Weges ist:
routes.MapRoute(
"WithAffiliate",
"x{affiliateExternalId}/{*url}",
new { controller="Home", action="LogCookieAndRedirect" }
);
Andere Tipps
Wenn ich es tun würde, würde ich es einer der Werte in dem Abfrage-String.
Beispiel:
http//www.domain.com/path/to/something?affiliate=X32&query=string
Das Problem ist, dass der Partner-ID ist optional . Wenn Sie es in den Weg gelegt werden Sie die Struktur des Pfad ändern, basierend auf, ob die Partner-ID vorhanden ist, so dass Sie jede Ihrer Routen zweimal zu tun haben (einmal mit dem Affiliate-ID, und einmal ohne) .
Sie kann nur haben diese allumfassende Route, wenn Sie nur eine Route definiert haben. Aber wenn Sie mehrere Routen haben, dann sind Sie gehen zu müssen, dass {affiliateExternalId}
Parameter zu allen Routen hinzuzufügen (es sei denn, ich etwas fehlt).
Ich zweite Robert Harvey 's Vorschlag .