【问题标题】:Adding route for admin controllers为管理员控制器添加路由
【发布时间】:2011-12-12 08:30:25
【问题描述】:

我已将所有管理控制器放在 Controller 文件夹中的 Admin 文件夹中。由于我的一个管理控制器与 Controller 文件夹中另一个控制器的名称匹配,我收到以下错误。

找到了多个与名为“产品”的控制器匹配的类型。如果为该请求提供服务的路由 ('{controller}/{action}/{id}') 未指定命名空间来搜索与请求匹配的控制器,则可能会发生这种情况。如果是这种情况,请通过调用采用“命名空间”参数的“MapRoute”方法的重载来注册此路由。

我尝试添加以下路线,但问题仍然相同

routes.MapRoute(
    "", //Route name 
    "Admin/{controller}/{action}/{id}", // Url with parameters 
    new { controller = "Home", action = "Index", id = UrlParameter.Optional });

我怎样才能摆脱这个错误。更改控制器的名称是我心中的最后一个选择。现在,我正在寻找一种方法来保留名称,看看我是否能找到另一种解决方法。

【问题讨论】:

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


    【解决方案1】:

    我已将我所有的管理控制器放在 Controller 文件夹中的 Admin 文件夹中

    好吧,那是你的问题。给定以下请求/admin/index(Controllers 文件夹中的那个或 Controllers/Admin 文件夹中的那个),您如何期望默认控制器工厂知道您想要实例化哪个控制器?请记住,默认控制器工厂会在从 Controller 派生的已加载程序集中搜索类型。它并不关心它们是在哪个文件夹中声明的。因此,当它发现您有 2 个同名的控制器时,它不知道该选择哪一个。

    一种可能性是使用区域。然后你可以在注册路由时指定命名空间:

    routes.MapRoute(
        "", 
        "Admin/{controller}/{action}/{id}",
        new { controller = "Home", action = "Index", id = UrlParameter.Optional },
        new[] { "AppName.Areas.Admin.Controllers" }
    );
    

    还要确保在 Global.asax 中为非区域控制器指定命名空间:

    routes.MapRoute(
        "Default",
        "{controller}/{action}/{id}",
        new { controller = "Home", action = "Index", id = UrlParameter.Optional },
        new[] { "AppName.Controllers" }
    );
    

    【讨论】:

    • 谢谢....这就是我想要实现的目标。我认为控制器工厂并不关心文件夹和所有内容。但无法找到您提供的解决方案。连asp.net网站上的文章都没有涉及到这个问题
    • 顺便说一句,我是否需要将Areas 添加到命名空间中。 AppName.Admin.Controllers 不就行了吗?
    • @PankajUpadhyay,这取决于您是否使用区域以及您的控制器组织在哪些命名空间中。
    • 它不是那么健壮。我已将我的管理控制器命名空间重命名为 PriceCompare.Areas.Admin.Controllers。这解决了问题,但我可以通过在其前面添加Admin/ 来访问任何通用控制器。另外,我可以直接访问我的管理控制器,而无需在它们前面使用Admin/。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-05
    • 2021-10-01
    • 1970-01-01
    • 2013-05-29
    • 2011-07-07
    • 2011-09-25
    • 1970-01-01
    相关资源
    最近更新 更多