Question

J'essaie de créer un itinéraire fourre-tout pour suivre quand une chaîne d'affilié est dans l'URL. Un code affilite est marqué par un x suivi d'un int et n'apparaîtra qu'à la fin d'une URL (mais avant la chaîne de requête).

L'idée est que je vais extraire l'ID d'affilié, faire une journalisation, puis faire un 301 à la même demande sans l'ID d'affilié.

Par exemple:

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

J'ai cette 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}" })
});

Ce qui ne correspond qu'à

http://www.domain.com/path/x32
http://www.domain.com/path/x32/

Que dois-je faire pour que tout corresponde et que la chaîne de requête soit transmise au contrôleur? Je soupçonne que je devrais utiliser un opérateur * , mais je ne parviens pas à le faire répondre à mes besoins.

Était-ce utile?

La solution

{* url} correspondra à l'intégralité du chemin plutôt qu'à un seul segment. Cependant, comme il correspond à l'intégralité du chemin, vous ne pouvez pas associer l'ID d'affilié à la fin. L'itinéraire correspondra à chaque demande. Vous pouvez contourner ce problème en ajoutant une contrainte de route pour vérifier que url a un ID d'affilié à la fin:

routes.MapRoute(
    "WithAffiliate",
    "{*url}",
    new { controller="Home", action="LogCookieAndRedirect" },
    new { url = @"/x[0-9]+
routes.MapRoute(
    "WithAffiliate",
    "x{affiliateExternalId}/{*url}",
    new { controller="Home", action="LogCookieAndRedirect" }
 );
quot; } );

Votre action devra ensuite analyser l'ID de l'affilié à partir du paramètre url lui-même. Si vous avez la possibilité de modifier la structure de l'URL, il serait possible de faire correspondre l'ID s'il se trouvait au début du chemin:

<*>

Autres conseils

Si je le faisais, j'en ferais l'une des valeurs de la chaîne de requête.

Exemple:

http//www.domain.com/path/to/something?affiliate=X32&query=string

Le problème est que l'identifiant de l'affilié est facultatif . Si vous le mettez dans le chemin, vous modifierez la structure du chemin en fonction de la présence ou non de l'identifiant d'affilié. Vous devrez donc effectuer deux fois chacun de vos itinéraires (une fois avec l'identifiant d'affilié et une fois sans). .

Vous ne pouvez avoir cet itinéraire polyvalent que si un seul itinéraire est défini. Mais si vous avez plusieurs itinéraires, vous devrez ajouter ce paramètre {affiliateExternalId} à tous les itinéraires (sauf si quelque chose me manque).

Je deuxième sur Robert Harvey de suggestion .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top