【问题标题】:Multiple controller route path in MVCMVC中的多控制器路由路径
【发布时间】:2015-05-02 04:44:05
【问题描述】:

我有以下类型的 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)

链接 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 个不同的路径。谁能帮帮忙。

【问题讨论】:

    标签: c# asp.net-mvc asp.net-mvc-routing


    【解决方案1】:

    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 中有控制器。

    在任何情况下,您都需要在建立区域链接时提供区域名称。当您提供字符串作为第三个参数时,您正在使用的重载将不起作用。

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

    正如here 指出的那样,即使您想导航到非区域链接,也需要指定区域。

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

    【讨论】:

    • 我已经尝试指定区域名称以及您提到的路由:@Html.ActionLink("Link A", "Method_Name_1", "Controller1", new { area = "Area_1" ​​}) @Html.ActionLink("Link B", "Method_Name_2", "Controller2", new { area = "Area_1" ​​}) 但是 html 仍然会渲染第二个链接,其中 controll2 作为操作链接中的控制器名称。您能建议在同一区域中的 2 个控制器的路由映射注册应该是什么???
    • 以上示例“default1”是您通常用于整个区域的内容。控制器名称是由 URL 中区域名称之后的第一段指定的变量。但请注意,指定路由的顺序很重要,如果您的配置中在预期路由之前存在匹配的路由,您将获得不同的结果。 AreaRegistration.RegisterAllAreas() 也应在 RouteConfig.RegisterRoutes() 之前指定,否则您的默认路由将覆盖您已配置的任何区域路由。
    • 我将区域 url 注册更改为: context.MapRoute( "Area_1", "Area_1/{controller}/{action}/{id}", new { controller = "Controller1|Controller2", action = "索引",id = UrlParameter.Optional } );但仍然没有用。我不明白同样的事情在区域外是如何工作的,有两个控制器 Home 和 Login。两个控制器都有自己独立的视图文件夹,AppRoute 的默认路由似乎可以正常工作。
    • 我建议你通过MSDN Areas Tutorialthis tutorial。显然,您在配置中忽略了一些您没有在问题中发布的内容,但我只能猜测它是什么。
    • @TechJay - 我同意 NightOw888 提供的答案。在这里查看我的观点:forums.asp.net/p/2048326/5903140.aspx 如果它解决了您的问题,我建议将此标记为正确答案。如果不回来,让我们讨论这个问题。
    猜你喜欢
    • 1970-01-01
    • 2012-04-14
    • 1970-01-01
    • 1970-01-01
    • 2012-06-08
    • 1970-01-01
    • 1970-01-01
    • 2018-03-26
    • 1970-01-01
    相关资源
    最近更新 更多