为管理员控制器添加路由

Pan*_*yay 1 c# asp.net-mvc-routing asp.net-mvc-3

我已将所有管理员控制器放在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 });
Run Code Online (Sandbox Code Playgroud)

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

Dar*_*rov 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" }
);
Run Code Online (Sandbox Code Playgroud)

同样在Global.asax中,请确保为非区域控制器指定名称空间:

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