MVC 中的多控制器路由路径

Multiple controller route path in MVC

我有以下类型的 mvc 应用程序区域文件夹结构:

区域 => 文件夹 A => 控制器 => 控制器 A 和控制器 B

我在 AreaRegistration 中使用了以下注册路径:

context.MapRoute(
            "default1",
            "FolderA/{controller}/{action}/{id}",
            new { controller = "ControllerA|ControllerB", action = "Index", id = UrlParameter.Optional }
        ); 

我在共享布局上有两个链接:

@Html.ActionLink("Link 1", "ActionA", "ControllerA", null)
@Html.ActionLink("Link 2", "ActionB", "ControllerB", null)

Link 1 似乎工作正常并按预期重定向。问题出在 Link2,它总是形成以下 url,我收到 404 错误。

http://localhost:29661/FolderA/ControllerA/ActionB?Length=15

默认应用路由路径为:

routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        ); 

似乎它总是在同一个控制器中寻找 ActionB,即使我注册了 2 个不同的路径。谁能帮忙解决一下。

ControllerA|ControllerB 不是有效的默认值。我相信你想要的是一个约束,而不是你的控制器的默认值。因此,您的路线应该如下所示:

context.MapRoute(
    "default1",
    "FolderA/{controller}/{action}/{id}",
    new { controller = "Home", action = "Index", id = UrlParameter.Optional },
    new { controller = "ControllerA|ControllerB" }
);

但在这种情况下你不需要约束,因为使用的路线可以由区域名称决定,所以你可以通过:

context.MapRoute(
    "default1",
    "FolderA/{controller}/{action}/{id}",
    new { action = "Index", id = UrlParameter.Optional }
);

如果 URL 中没有提供控制器,则控制器的默认位置将是它导航到的位置。您可以使用您所在区域的控制器作为默认控制器,或者排除默认控制器以要求 URL.

中有一个控制器

无论如何,在建设link区域时需要提供区域名称。当您提供字符串作为第三个参数时,您正在使用的重载将不起作用。

@Html.ActionLink("Link 1", "ActionA", "ControllerA", new { area = "FolderA" }, null)
@Html.ActionLink("Link 2", "ActionB", "ControllerB", new { area = "FolderA" }, null)

正如所指出的 here,即使您想导航到非区域,也需要指定区域 link。

@Html.ActionLink("Home", "Index", "Home", new { area = "" }, null)