Pregunta

Estoy tratando de crear una ruta de captura para rastrear cuando una cadena de afiliados está en la URL. Un código de afiliado está marcado por un x seguido de un int , y solo aparecerá al final de una URL (pero antes de la cadena de consulta).

La idea es que extraeré el ID de afiliado, haré un registro y luego haré un 301 para la misma solicitud sin el ID de afiliado.

Por ejemplo:

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

Tengo esta ruta

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

Que solo coincide

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

¿Qué debo hacer para hacer coincidir todo y pasar la cadena de consulta al controlador? Hay un operador * que sospecho que debería usar, pero no puedo hacer que haga lo que necesito.

¿Fue útil?

Solución

{* url} coincidirá con la ruta completa en lugar de solo un segmento. Sin embargo, dado que coincide con la ruta completa, no puede coincidir con el ID de afiliado al final. La ruta coincidirá con cada solicitud. Puede evitar eso agregando una restricción de ruta para verificar que url tenga una ID de afiliado al final:

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

Su acción deberá analizar el ID de afiliado desde el propio parámetro url . Si tiene la opción de modificar la estructura de la URL, sería posible hacer coincidir la ID si estuviera al comienzo de la ruta:

<*>

Otros consejos

Si lo estuviera haciendo, lo convertiría en uno de los valores de la cadena de consulta.

Ejemplo:

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

El problema es que el ID de afiliado es opcional . Si lo coloca en la ruta, cambiará la estructura de la ruta en función de si está presente o no la identificación del afiliado, por lo que tendrá que hacer cada una de sus rutas dos veces (una vez con la identificación del afiliado y una sin él) .

Solo puede tener esta ruta de alcance general si solo tiene una ruta definida. Pero si tiene varias rutas, entonces tendrá que agregar ese parámetro {affiliateExternalId} a todas las rutas (a menos que me esté faltando algo).

Yo segundo Robert Harvey 's sugerencia .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top