Я не понимаю, почему вы не можете просто определить каждый из них как отдельный маршрут, используя регулярное выражение при необходимости. Например, чтобы различать /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
в качестве заголовка.
Всякий раз, когда вы создаете маршрут для чего-то, помните следующее:
- Ограничить параметры маршрута с помощью RegEx
- Будьте
very
осведомлены о порядке маршрута (какой маршрут предшествует которому)
- волнистые скобки
{something}
обозначают параметры действия
Несколько хороших уроков: