25

私のエリアは以下です。気になる部分だけハイライト。

ここに画像の説明を入力

ルート テーブル

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
    );
}

これは、URLが次のような場合にのみ機能します

localhost:2474/SOProblems/ChildController/index 

URLがこのような場合、これは機能しません

localhost:2474/SOProblems/SubFolder/ChildController/index

何が足りないのか教えてください。

4

3 に答える 3

18

URL が localhost:2474/SOProblems/SubFolder/ChildController/index のような場合、これは機能しません。

それは正常です。ルート パターンは次のように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) にはアクション名を指定する可能性がないため、このコントローラーでは 1 つのアクションしか持つことができず、それがindexこの場合に登録した既定のアクション ( ) になります。

このコントローラーでより多くのアクションを実行したいが、 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" }
    );
}
于 2013-06-21T15:14:42.197 に答える