Asp.Net MVC Routing - как мне сопоставить весь URL? - PullRequest
5 голосов
/ 24 октября 2009

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

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

Например:

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/

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

Ответы [ 3 ]

10 голосов
/ 25 октября 2009

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

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

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

routes.MapRoute(
    "WithAffiliate",
    "x{affiliateExternalId}/{*url}",
    new { controller="Home", action="LogCookieAndRedirect" }
 );
0 голосов
/ 24 октября 2009

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

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

0 голосов
/ 24 октября 2009

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

Пример:

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

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

...