为管理员控制器添加路由

时间:2011-12-12 08:30:26

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

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

  

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

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

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

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

1 个答案:

答案 0 :(得分:6)

  

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

中的Admin文件夹中

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

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

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