Подтвердить что ты не робот

Может ли кто-нибудь объяснить синтаксис маршрутизации asp.net для меня?

Я имею дело с этим кодом в сценарии Web Forms:

  public static void RegisterRoutes(RouteCollection routes)
  {

    Route r = new Route("{*url}", new MyRouteHandler());
    routes.Add(r);
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
    routes.IgnoreRoute("{resource}.gif/{*pathInfo}");

  }

Во-первых, может ли кто-нибудь сказать мне, где находится defintion {* pathInfo}? http://msdn.microsoft.com/en-us/library/cc668201.aspx#url_patterns не определяет его. Ли:

routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

Match

/c/xyz.axd and 
/b/c/xyz.axd and
/a/b/c/xyz.axd 

В то время как

routes.IgnoreRoute("{resource}.axd");

Только совпадения

/xyz.axd

Во-вторых, в:

{*url}

Что означает *? И что означает выражение в целом. Есть ли где-то это ясно объяснено?

В-третьих, есть ли определенный порядок, который мне нужно добавить, чтобы правильно игнорировать маршруты? Я знаю, что {* url} - это нечто вроде catchall, если IgnoreRoutes приходят до или после него, например,

routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.IgnoreRoute("{resource}.gif/{*pathInfo}");
Route r = new Route("{*url}", new MyRouteHandler());
routes.Add(r);
4b9b3361

Ответ 1

Мои 2 цента: Маршрут не является регулярным выражением. Это просто переменные и статические компоненты, которые составляют маршрут, разделенный сегментами (обозначается косой чертой). Там один специальный символ, звездочка в последней переменной, что означает здесь, игнорирует разделитель сегментов - косую черту. Итак,

{*url} 

- самый простой маршрут, потому что он означает весь URL-адрес, помещает его в переменную 'url' и передает это на страницу, связанную с этим маршрутом.

{controller}/{action}/{id}

помещает все в первый сегмент - вплоть до первой косой черты - в переменную 'controller', помещает все между первой и второй/в переменную 'action', и все между вторым и третьим косой чертой (или конец) в переменную 'id'. эти переменные затем передаются на связанную страницу.

{resource}.axd/{*pathInfo}

здесь, поместите информацию до .axd/(и не может иметь никаких слэшей!) в "ресурс" и поместите все после первого/в "pathInfo". Поскольку это, как правило, ignoreRoute, поэтому вместо того, чтобы передавать его на связанную страницу, он обрабатывается StopHandler, что означает, что маршрутизация не будет работать с ним, а вместо этого обрабатывается немаршрутизатором HttpHandler.

Как говорит bleevo, маршруты выполняются, чтобы они были добавлены в коллекцию. поэтому IgnoreRoute необходимо добавить до того, как обрабатывается общий маршрут.

Здесь устье лошади: http://msdn.microsoft.com/en-us/library/cc668201.aspx

Конкретный для вашего примера, я бы поместил строки IgnoreRoute над добавлением Route, потому что ваш маршрут фактически является уловкой. Кроме того, помните, что игнорирование .gif будет выполнено только в том случае, если gif находится в корневом каталоге.

Ответ 2

pathinfo - это всего лишь метка для ведра. Так, например, * pathinfo говорит, что помещает все после {resource}.axd/в pathinfo.

Маршруты выполняются в том порядке, в котором вы размещаете их в таблице маршрутов, поэтому, если ваш самый первый маршрут является уловкой, все остальные никогда не будут выполняться.