2009-10-24 4 views
4

J'essaie de créer une route fourre-tout pour suivre quand une chaîne d'affiliation est dans l'URL. Un code affilié 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).Asp.Net MVC Routing - comment faire correspondre l'ensemble de l'URL?

L'idée est que je vais extraire l'ID d'affilié, faire un enregistrement, 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 

Je 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}" }) 
}); 

qui correspond uniquement à

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

Que dois-je faire pour correspondre à tout et passer la chaîne de requête le controlle? Il y a un opérateur * que je suppose que je devrais utiliser, mais je ne peux pas l'obtenir pour faire ce dont j'ai besoin.

Répondre

9

{*url} correspondra au chemin entier plutôt qu'à un seul segment. Cependant, comme il correspond à l'ensemble du chemin, vous ne pouvez pas faire correspondre l'ID d'affilié à la fin. L'itinéraire correspondra à chaque demande. Vous pouvez contourner cela 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]+$" } 
); 

Votre action devra ensuite analyser l'ID d'affilié 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 si elle était au début du chemin:

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

Eh oui, je peux changer la structure de l'URL. La 2ème méthode devrait être parfaite. Merci. –

0

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

Exemple:

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

Le problème est que l'ID d'affilié est en option. Si vous le mettez dans le chemin, vous changerez la structure du chemin en fonction de la présence ou non de l'identifiant de l'affilié, donc vous devrez faire deux fois chacune de vos routes (une fois avec l'identifiant d'affilié, et une fois sans) .

0

Vous ne pouvez avoir cet itinéraire fourre-tout que si vous avez défini une seule route. Mais si vous avez plusieurs routes, alors vous devrez ajouter ce paramètre {affiliateExternalId} à toutes les routes (sauf si quelque chose me manque).

Je seconde Robert Harveysuggestion.