Asp.Net Маршрутизация MVC - как мне сопоставить весь URL-адрес целиком?

StackOverflow https://stackoverflow.com/questions/1618896

Вопрос

Я пытаюсь создать универсальный маршрут для отслеживания наличия партнерской строки в URL-адресе.Идентификационный код помечается знаком x за которым следует int, и будет отображаться только в конце URL-адреса (но перед строкой запроса).

Идея заключается в том, что я извлеку идентификатор партнера, проведу некоторое протоколирование, затем выполню 301 ответ на тот же запрос без идентификатора партнера.

Например:

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

У меня есть этот маршрут

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

Который соответствует только

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

Что мне нужно сделать, чтобы сопоставить все и передать строку запроса контроллеру?Существует * оператор, который, как я подозреваю, мне следует использовать, но я не могу заставить его делать то, что мне нужно.

Это было полезно?

Решение

{* url} будет соответствовать всему пути, а не одному сегменту. Однако, поскольку он соответствует всему пути, вы не можете сопоставить идентификатор партнера в конце. Маршрут будет соответствовать каждому запросу. Вы можете обойти это, добавив ограничение маршрута, чтобы проверить, что url имеет идентификатор партнера в конце:

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

В этом случае вашему действию потребуется проанализировать идентификатор партнера по самому параметру url . Если у вас есть возможность изменить структуру URL-адреса, можно будет сопоставить идентификатор, если бы он был в начале пути:

<*>

Другие советы

Если бы я делал это, я бы сделал это одним из значений в строке запроса.

Пример:

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

Проблема в том, что идентификатор партнера необязательно.Если вы добавите его в path, вы измените структуру path в зависимости от того, присутствует ли идентификатор партнера или нет, поэтому вам придется выполнять каждый из ваших маршрутов дважды (один раз с идентификатором партнера и один раз без).

Вы можете использовать этот универсальный маршрут только в том случае, если у вас определен только один маршрут.Но если у вас есть несколько маршрутов, то вам придется добавить это {affiliateExternalId} параметр для всех маршрутов (если только я чего-то не упустил).

Я второй Роберт Харви's предложение.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top