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.

War es hilfreich?

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 .

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top