题 子文件夹中的控制器


我的区域在下面。只突出了相关部分。

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

这只适用于url是这样的

localhost:2474/SOProblems/ChildController/index 

当url是这样时,这不起作用

localhost:2474/SOProblems/SubFolder/ChildController/index

你能告诉我缺少什么吗?


19
2018-06-18 20:51


起源


“不起作用”意味着什么? - TGlatzer
@ Grumbler85 - 最后一个尝试过的网址给出404, - Imad Alazani
反引号只在这里“SubFolder` / ChildController”?并检查子文件夹中的命名空间是否设置正确。 - TGlatzer
是的,这是正确的。有拼写错误。现在更正了。谢谢。 - Imad Alazani


答案:


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

15
2018-06-21 15:14



“RegisterArea”来自哪里?我搜索了整个解决方案,结果为零。 - usefulBee
@usefulBee“RegisterArea”出现在Visual Studio脚手架新的时候 添加>区域... - Jasen


您的新路线“SubFolder”不包括在路线中包含操作的可能性(在您的情况下,“索引”)。

您的示例网址

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

或者从测试网址上取下“索引”。


5
2018-06-19 02:04



这不起作用。 - Imad Alazani


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


2
2018-05-16 04:05



这正是我想要的。谢谢 - MetalPhoenix