Ответ 1
Это не работает, когда URL-адрес подобен этому локальный: 2474/SOProblems/подпапка/ChildController/индекс
Это нормально. Шаблон маршрута выглядит так: SubFolder/ChildController
, а не SubFolder/ChildController/index
. В дополнение к этому вы определили свой маршрут в НЕПРАВИЛЬНОМ месте. Вы определили его в своих основных определениях маршрутов, а не в определениях маршрутов в вашем регионе. Поэтому избавитесь от определения пользовательского маршрута с основных маршрутов и добавьте его в файл SOProblemsAreaRegistration.cs
(где должны быть зарегистрированы ваши маршруты SOProblems
):
public override void RegisterArea(AreaRegistrationContext context)
{
context.MapRoute(
"SubFolderRoute",
"SOProblems/SubFolder/ChildController",
new { controller = "ChildController", action = "Index" },
new[] { "Practise.Areas.SOProblems.Controllers.SubFolder" }
);
context.MapRoute(
"SOProblems_default",
"SOProblems/{controller}/{action}/{id}",
new { action = "Index", id = UrlParameter.Optional }
);
}
Кроме того, поскольку ваш шаблон маршрута (SOProblems/SubFolder/ChildController
) не имеет возможности указывать имя действия, вы можете иметь только одно действие на этом контроллере, и это будет действие по умолчанию, которое вы зарегистрировали (index
) в этот случай.
Если вы хотите иметь больше действий над этим контроллером, и все же индекс будет по умолчанию, вы должны включить это в свой шаблон маршрута:
context.MapRoute(
"SubFolder",
"SOProblems/SubFolder/ChildController/{action}",
new { controller = "ChildController", action = "Index" },
new[] { "Practise.Areas.SOProblems.Controllers.SubFolder" }
);
В обоих случаях ваше основное определение маршрута может оставаться со значениями по умолчанию:
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
"Default",
"{controller}/{action}",
new { controller = "Home", action = "Index" }
);
}