Одно из главных препятствий, которые я, кажется, имею недавно, добирается, моя голова вокруг некоторых более сложных требований маршрутизации для некоторого MVC основывала приложения, которые я разрабатывал. У меня есть проблемы, находя, что правильный набор учебных руководств обходит меня через него для получения полного понимания.
То, что я хотел бы найти, является полным набором учебных руководств для всего направляющего от основного (контроллер/действие/идентификатор) к усовершенствованному.
Примером того, что я называю расширенной маршрутизацией, являются вещи как:
/blog/year/month/day/title
- отобразился бы на контроллер: blog
и действие: post
и как параметры: year
, month
, day
и title
/blog/title
- отобразился бы на контроллер: blog
и действие: post
и как параметры: title
/title
- отобразился бы на контроллер: blog
и действие: post
и как параметры: title
Я мог отобразить каждый возможный набор на явный маршрут в глобальном использовании базы данных, но это кажется, что побеждает точку наличия маршрута механизма маршрутизации к корректному месту. Я определил бы правило однажды.
Я не понимаю, почему вы не можете просто определить каждый из них как отдельный маршрут, используя при необходимости регулярное выражение. Например, чтобы различать / блог / год / месяц / день / заголовок
и / блог / заголовок
.
Каждый из этих наборов представляет собой отдельный случай, и вам нужно указать MVC, что с каждым из них делать. Вы можете сделать это, определив правило один раз
в файле Global.asax.cs
:
Для первого случая: / блог / год / месяц / день / 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
.
Каждый раз, когда вы создаете маршрут для чего-то, имейте в виду следующее:
очень
осведомлены о порядке маршрута (какой маршрут предшествует которому) {something}
обозначают параметры действия Некоторые полезные руководства: