Я пытаюсь создать гибкую маршрутизацию URL.
Так что URL вроде
en-US/ctrl/act/1/2
должен сделать то же самое, что и
ctrl/act/1/2
и установите культуру в en-US.
Теперь я достиг этого, определив два маршрута следующим образом:
routes.MapRoute(
"Ctrl",
"ctrl/{action}/{group}/{page}",
new { controller = "Home", action = "Index", group = 1, page = 1 },
new { group = @"\d+", page = @"\d+" }
);
routes.MapRoute("CtrlWithCulture",
"{culture}/ctrl/{action}/{group}/{page}",
new { culture = "", controller = "Home", action = "Index", group = 1, page = 1 },
new { culture = "[a-z]{2}-(?:[a-zA-Z]{2,4}-)*(?:[a-zA-Z]{2,4})", group = @"\d+", page = @"\d+" }
);
У меня есть базовый контроллер, который устанавливает культуру на основе входного параметра.
Но я хочу иметь эту функциональность по умолчанию для всех маршрутов, поэтому я попробовал что-то вроде этого.
Global.asax.cs:
routes.MapRoute("RootWithCulture",
"{culture}/{*rest}",
new { controller = "Home", action = "Index", culture = "" },
new { culture = "[a-z]{2}-(?:[a-zA-Z]{2,4}-)*(?:[a-zA-Z]{2,4})" }
);
MyController.cs
public class MyController : Controller
{
...
protected override void OnActionExecuting(ActionExecutingContext context)
{
if (!String.IsNullOrEmpty(context.RouteData.Values["culture"].ToStringOrNull()))
{
this.SetCulture(String.IsNullOrEmpty(context.RouteData.Values["culture"])
context.RouteData.Values.Remove("culture");
// I'm stuck here!
// I want to try other routes and find and execute the right one...
Я не уверен, что будет правильным подходом к этому ...