我已将所有管理员控制器放在 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 });
我怎样才能摆脱这个错误。改变控制器的名称是我心中的最后一个选择。现在,我正在寻找一种保存名称的方法,看看我是否能找到另一种方法。
答案 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" }
);