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) 无法指定操作名称,因此您只能在此控制器上执行一个操作,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 回答
6

您的新路线“子文件夹”不包括在路线中包含操作的可能性(在您的情况下为“索引”)。

您的示例网址

localhost:2474/SOProblems/SubFolder/ChildController/index

想要尝试匹配如下路线:

"SubFolder/ChildController/{action}"

但是您的路线中没有包含“{action}”,因此它与您的路线不匹配。然后它尝试默认路由,这显然失败了。

尝试将“{action}”添加到您的路线:

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

或从您的测试网址中删除“索引”。

于 2013-06-19T02:04:05.333 回答
3

对于希望这样做的任何未来用户;研究使用区域。这是一个有用的视频。 使用区域组织应用程序

于 2017-05-16T04:05:19.310 回答