簡體   English   中英

ASP.NET MVC 2中具有一個名稱的多個控制器

[英]Multiple Controllers with one Name in 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
 );

但這並沒有解決它。

找到了多個匹配名為“帳戶”的控制器的類型。

我該如何解決這個問題?

如果您重構項目並將默認命名空間和程序集從“MVCApplication1”更改為“uqs”,則最終可能會在bin目錄(新目錄和舊目錄)中使用2個程序集。 您可以收到此錯誤,因為AccountController在兩個程序集中。

清理舊MVCApplication1.dll的bin目錄。

您的應用程序中不能有多個名為Account控制器,即使在不同的命名空間中也是如此。

您必須按Area (ASP.NET MVC 2中的一項功能)拆分這些控制器。

如果您執行Find for AccountController您將在應用程序中找到名為Account所有控制器; 如果你想要它們,或者刪除它們,將它們移到不同的Areas

有同樣的問題。 清理垃圾桶,我很高興。

即使提供了名稱空間,也可能發生問題的輕微混淆(類似於它導致相同的錯誤消息)。 我認為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只是要求你在存在潛在的歧義時更加明確。

AccountController由ASP.NET MVC Visual Studio模板自動生成。 它位於Controllers\\AccountController.cs 嘗試在項目中搜索並刪除它。

我有這個問題......

通過刪除其中一個.csproj文件中的項目引用來解決此問題

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM