ASP.NET MVC 2中具有一个名称的多个控制器

尝试运行我的ASP.NET MVC应用程序时收到以下错误:

对’Account’的请求找到了以下匹配的控制器: uqs.Controllers.Admin.AccountController MvcApplication1.Controllers.AccountController

我在项目中搜索了MvcApplication1.Controllers.AccountController来删除它,但我找不到匹配项。

我尝试注册修复它的路线:

  routes.MapRoute( "LogAccount", // Route name "{controller}/{action}/{id}", // URL with parameters new { controller = "Account", action = "LogOn", id = "" }, new string[] { "uqs.Controllers.Admin" } // Parameter defaults ); 

但这并没有解决它。

发现多个类型与名为“帐户”的控制器匹配。

我该如何解决这个问题?

您的应用程序中不能有多个名为Account控制器,即使在不同的命名空间中也是如此。

您必须按Area (ASP.NET MVC 2中的一项function)拆分这些控制器。

如果您执行Find for AccountController您将在应用程序中找到名为Account所有控制器; 如果你想要他们两个,或者删除一个,将它们移到不同的Areas

如果您重构项目并将默认命名空间和程序集从“MVCApplication1”更改为“uqs”,则最终可能会在bin目录(新目录和旧目录)中使用2个程序集。 您可以收到此错误,因为AccountController在两个程序集中。

清理旧MVCApplication1.dll的bin目录。

有同样的问题。 清理垃圾桶,我很高兴。

即使提供了名称空间,也可能发生问题的轻微混淆(类似于它导致相同的错误消息)。 我觉得MVC 3在这方面比MVC 2更挑剔。


简答:

确保控制器的命名空间实际上是MapRoute调用中指定的命名空间!!


答案很长

我有3个区域: default ("") / Facebook / Store ,每个区域都有AdminController

我有这样的路由映射(对于我的默认区域):

 routes.MapRoute( "Default", "{controller}/{action}/{id}", new { controller = "Gateway", action = "Index", id = UrlParameter.Optional }, new string[] { "RR.Controllers.Main" } ); 

对/ admin的请求发出以下错误:

找到了多个匹配名为“admin”的控制器的类型。 如果为此请求提供服务的路由('{controller} / {action} / {id}’)未指定名称空间,则会发生这种情况……

对’admin’的请求找到了以下匹配的控制器:

RR.FacebookControllers.AdminController
RR.Controllers.AdminController
RR.StoreControllers.AdminController

但等一下! 我没有指定控制器名称空间….? 这是怎么回事…. ?

事实certificate我的默认区域的管理员控制器名称空间是RR_MVC.Controller而不是Rolling_Razor_MVC.Controller.Main

出于某些原因,在MVC 2中这没有出现问题,但在MVC 3中确实如此。 我认为MVC 3只是要求你在存在潜在的歧义时更加明确。

AccountController由ASP.NET MVC Visual Studio模板自动生成。 它位于Controllers\AccountController.cs 。 尝试在项目中搜索并删除它。

我有这个问题……

通过删除其中一个.csproj文件中的项目引用来解决此问题