Расширенные учебники и примеры по маршрутизации ASP - PullRequest
9 голосов
/ 26 февраля 2010

Одно из основных препятствий, с которыми я, похоже, столкнулся в последнее время, - это обдумать некоторые из более сложных требований к маршрутизации для некоторых приложений на основе MVC, которые я разрабатывал. У меня проблемы с поиском подходящего учебника, который поможет мне разобраться в этом.

То, что я хотел бы найти, - это полный набор учебных пособий для всего, начиная от базового (контроллер / действие / идентификатор) до продвинутого.

Примером того, что я называю расширенной маршрутизацией, являются такие вещи:

/blog/year/month/day/title - будет отображаться на контроллер: blog и действие: post и в качестве параметров: year, month, day и title

/blog/title - будет отображаться на контроллер: blog и действие: post и в качестве параметров: title

/title - будет отображаться на контроллер: blog и действие: post и в качестве параметров: title

Я мог бы сопоставить каждый возможный набор с явным маршрутом в глобальном масштабе, используя базу данных, но похоже, что он побеждает точку, из-за которой механизм маршрутизации направляется в правильное место. Я бы лучше определил правило один раз.

1 Ответ

17 голосов
/ 26 февраля 2010

Я не понимаю, почему вы не можете просто определить каждый из них как отдельный маршрут, используя регулярное выражение при необходимости. Например, чтобы различать /blog/year/month/day/title и /blog/title.

Каждый из этих наборов является отдельным случаем, и вам нужно указать MVC, что делать с каждым из них. Вы можете сделать это с помощью defining the rule once в файле Global.asax.cs:

Для первого случая: /blog/year/month/day/title

routes.MapRoute(
    "Blog Full Route", // Route name
    "blog/{year}/{month}/{day}/{title}", // URL with parameters
    new {controller = "blog", action = "post"},   // Defaults
    new {year = @"\d+", month= @"\d+", day = @"\d+"} // Constrain parameters with RegEx patterns
    );

Для второго случая: /blog/title

routes.MapRoute(
    "Blog Title Route", // Route name
    "blog/{title}", // URL with parameters
    new {controller = "blog", action = "post"},   // Defaults
    );

Для последнего случая: /title

routes.MapRoute(
    "Title Route", // Route name
    "{title}", // URL with parameters
    new {controller = "blog", action = "post"},   // Defaults
    );

Хитрость заключается в размещении этих маршрутов в точном порядке, с наименее конкретным в нижней части. Изменение порядка приведет к неправильному использованию маршрута (особенно в двух последних). Если последний случай был переключен на второй, URL-адреса типа blog/SomeTitle перенаправили бы на действие post с blog в качестве заголовка.

Всякий раз, когда вы создаете маршрут для чего-то, помните следующее:

  1. Ограничить параметры маршрута с помощью RegEx
  2. Будьте very осведомлены о порядке маршрута (какой маршрут предшествует которому)
  3. волнистые скобки {something} обозначают параметры действия

Несколько хороших уроков:

...