Подтвердить что ты не робот

Контроллер в подпапке

Моя область ниже. Выделяется только соответствующая часть.

enter image description here

Таблица маршрутов

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

    routes.MapRoute(
        "SubFolder", // Route name
        "SubFolder/ChildController",
        new { controller = "ChildController", action = "Index" },
        new[] { "Practise.Areas.SOProblems.Controllers.SubFolder" });


    routes.MapRoute(
        "Default", // Route name
        "{controller}/{action}", // URL with parameters
        new { controller = "Home", action = "Index" } // Parameter defaults
    );
}

This only works when the url is like this 
localhost:2474/SOProblems/ChildController/index 

This does not works when the url is like this 
localhost:2474/SOProblems/SubFolder/ChildController/index

Не могли бы вы рассказать мне, что не хватает?

4b9b3361

Ответ 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" }
    );
}

Ответ 2

Ваш новый маршрут "SubFolder" не включает возможность включения действия на маршруте (в вашем случае "Индекс" ).

Ваш образец URL

localhost:2474/SOProblems/SubFolder/ChildController/index

Хочет попытаться сопоставить маршрут, например:

"SubFolder/ChildController/{action}"

Но вы не включаете "{действие}" в свой маршрут, чтобы он не соответствовал вашему маршруту. Затем он пытается использовать маршрут по умолчанию, который явно не работает.

Попробуйте добавить "{action}" к вашему маршруту:

routes.MapRoute(
    "SubFolder", // Route name
    "SubFolder/ChildController/{action}",
    new { controller = "ChildController", action = "Index" },
    new[] { "Practise.Areas.SOProblems.Controllers.SubFolder" });

или запишите "индекс" с вашего тестового URL.