Domanda

Sto cercando di creare un percorso universale per tracciare quando una stringa di affiliazione è nell'URL. Un codice affiliato è contrassegnato da un x seguito da un int e verrà visualizzato solo alla fine di un URL (ma prima della stringa di query).

L'idea è che estrarrò l'ID affiliato, farò un po 'di registrazione, quindi farò un 301 alla stessa richiesta senza l'ID affiliato.

Ad esempio:

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

Ho questo percorso

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

Che corrisponde solo

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

Cosa devo fare per abbinare tutto e passare la stringa di query al controller? C'è un operatore * che sospetto dovrei usare, ma non riesco a farlo per quello che mi serve.

È stato utile?

Soluzione

{* url} corrisponderà all'intero percorso anziché a un solo segmento. Tuttavia, poiché corrisponde all'intero percorso, non è quindi possibile abbinare l'ID affiliato alla fine. Il percorso corrisponderà ad ogni richiesta. Puoi aggirare questo aggiungendo un vincolo di percorso per verificare che url abbia un ID affiliato alla fine:

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

La tua azione dovrà quindi analizzare l'ID affiliato dal parametro url stesso. Se hai la possibilità di modificare la struttura dell'URL, sarebbe possibile abbinare l'ID se fosse all'inizio del percorso:

<*>

Altri suggerimenti

Se lo facessi, lo renderei uno dei valori nella stringa di query.

Esempio:

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

Il problema è che l'id affiliato è opzionale . Se lo inserisci nel percorso, modificherai la struttura del percorso in base alla presenza o meno dell'ID affiliato, quindi dovrai fare ognuno dei tuoi percorsi due volte (una volta con l'id affiliato e una volta senza) .

Puoi avere questo percorso universale solo se hai definito un solo percorso. Ma se hai più percorsi, dovrai aggiungere quel parametro {affiliateExternalId} a tutti i percorsi (a meno che non mi manchi qualcosa).

I secondi suggerimento .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top