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

时间:2010-04-13 07:23:39

标签: c# asp.net-mvc asp.net-mvc-2 routing controllers

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

  

“帐户”请求找到了以下匹配的控制器:   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
 );

但这并没有解决它。

  

找到匹配的多种类型   控制器名为“帐户”。

我如何解决这个问题?

6 个答案:

答案 0 :(得分:61)

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

清理旧MVCApplication1.dll的bin目录。

答案 1 :(得分:11)

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

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

如果您对AccountController进行查找,您将在应用程序中找到名为Account的所有控制器;如果你想要它们,可以将它们移到不同的Areas,或者删除它们。

答案 2 :(得分:4)

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

答案 3 :(得分:3)

即使提供了名称空间,也可能发生问题的轻微混淆(类似地导致相同的错误消息)。我认为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

但等一下!我没有指定控制器名称空间....?发生了什么......?

原来我的默认区域的管理控制器命名空间是RR_MVC.Controller而不是Rolling_Razor_MVC.Controller.Main

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

答案 4 :(得分:0)

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

答案 5 :(得分:0)

我有这个问题......

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