我的项目中多个同名控制器出现问题


96

我的ASP.NET MVC 3项目遇到以下错误:

找到了多个与名为“ Home”的控制器匹配的类型。如果为该请求提供服务的路由(“ Home / {action} / {id}”)未指定名称空间来搜索与该请求匹配的控制器,则会发生这种情况。如果是这种情况,请通过调用带有“名称空间”参数的“ MapRoute”方法的重载来注册此路由。

对“家”的请求已找到以下匹配的控制器:MyCompany.MyProject.WebMvc.Controllers.HomeController MyCompany.MyProject.WebMvc.Areas.Company.Controllers.HomeController

我的默认控制器文件夹中有一个HomeController,其类名为MyCompany.MyProject.WebMvc.Controllers.HomeController。

我的global.asax中的RegisterRoutes方法如下所示:

    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapRoute(
            "Default", // Route name
            "{controller}/{action}/{id}", // URL with parameters
            new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
        );
    }

然后,我有一个名为Company的区域,该区域的默认控制器文件夹中有一个HomeController,其类名为MyCompany.MyProject.WebMvc.Areas.Company.Controllers.HomeController。

CompanyAreaRegistration文件中的RegisterArea方法如下所示:

   public override void RegisterArea(AreaRegistrationContext context)
    {
        context.MapRoute(
            "Company_default",
            "Company/{controller}/{action}/{id}",
            new { area = "Company", action = "Index", id = UrlParameter.Optional }
        );
    }

所有这些都导致了我在本文开头强调的错误。我正在努力从其他运筹帷 to拼凑出解决方案,但没有运气

是否可以在默认的controllers文件夹中放置一个HomeController,然后在每个区域中放置一个HomeController?如果是这样,我是否需要对配置文件进行更改(假设进行了更改)以使此工作有效?

任何帮助将非常感激!


请参阅此stackoverflow.com/a/12633541/2089963。它对我
有用

当我重命名项目/程序集时,我发生了这种情况,我只是删除了bin文件夹并重新编译了项目,并且工作正常。
核心

Answers:


167

错误消息包含建议的解决方案:“如果是这种情况,请通过调用带有'namespaces'参数的'MapRoute'方法的重载来注册此路由。

routes.MapRoute(
     "Default", // Route name
     "{controller}/{action}/{id}", // URL with parameters
     new { controller = "Home", action = "Index", id = UrlParameter.Optional }, // Parameter defaults
     new string[] { "MyCompany.MyProject.WebMvc.Controllers"}
);

这将使http:// server /转到HomeController的Index动作,我想这就是您想要的。http:// server / company / home将转到区域注册中定义的公司区域的HomeController的Index操作。


1
我没有测试过,但是namespaces参数是一个字符串数组,因此您应该可以通过添加到数组中来传递任何数字:new string[] { "MyCompany.MyProject.WebMvc.Controllers", "My.Second.Namespace", "My.Third.Namespace", "Namespaces.Etc" }
David Ruttka 2012年

2
该命名空间模式对我不起作用。MyProject.Controllers但是。
松饼人2012年

我尝试过这个。但是此类中的索引MyCompany.MyProject.WebMvc.Areas.Company.Controllers.HomeController正在执行。但是视图出现的是旧的。
kbvishnu 2013年

值得一提的是,由于类型推断和变量含义,此处的第4个参数可能会造成混淆。第4个参数可以是按名称空间约束的字符串数组,也可以是添加IRouteConstraints或可以解释为约束的字符串的对象,也可以有5个参数,并且同时包含这两个参数。aspnetwebstack.codeplex.com/SourceControl/changeset/view/…–
克里斯·

同样值得注意的是,默认情况下,路径会找到通向其他名称空间的路径-如果您想将路径锁定到一个名称空间或一组名称空间,则必须禁用此后备功能:bubblogging.wordpress.com/2012/06/09/mvc-路由命名空间(页面底部)
Chris Moschini

30

这是asp.net mvc4方法:

 routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "RegisterNow", id = UrlParameter.Optional },
            namespaces: new[] { "YourCompany.Controllers" }
        );

2
谢谢,这为我解决了这个问题,尽管我一生都无法弄清楚为什么我的应用程序首先认为有两个家用控制器。我对名称空间进行了搜索和替换,这似乎引起了问题,但是对整个解决方案的搜索并未显示恶意名称空间的任何实例。
Yann Duran 2013年

12
好吧,我找到了问题的原因。希望这可以像我今天一样帮助其他人拼命寻找。因为我已经更改了应用程序的名称(以及名称空间),所以bin文件夹中仍然留有一个DLL,并且没有被干净删除。幕后必须有一些MEF魔法。一旦发现并删除了旧的DLL,问题就消失了。难怪文本搜索找不到它!
Yann Duran 2013年

@YannDuran,遇到类似的问题,您的固定帮助。谢谢。
克劳斯NJI

12

我已经重命名了命名空间,所以,我只删除文件夹binobj重新构建,然后再次工作。



2

用这个

routes.MapRoute(
            "Default",
            "{controller}/{action}/{id}",
            new { controller = "Home", action = "Index", id = UrlParameter.Optional },
            new[] { "ProjectName.Controllers" }
        );

1

仅使用项目名称:

Public Class RouteConfig
    Public Shared Sub RegisterRoutes(ByVal routes As RouteCollection)
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}")
        routes.MapRoute( _
            name:="Default", _
            url:="{controller}/{action}/{id}", _
            defaults:=New With {.controller = "Home", .action = "Index", .id = UrlParameter.Optional} _
           , namespaces:={"MvcAreas"})  
    End Sub

1

如果您使用的是RazorGenerator,仅通知namespaces参数可能还不够。

我必须解决添加以下标记的语句Global.asax.cs

    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        BundleConfig.RegisterBundles(BundleTable.Bundles);
        ControllerBuilder.Current.DefaultNamespaces.Add("MyProject.Controllers"); // This one
    }

0

正如Chris Moschini所提到的,如果您有两个具有相同控制器名称且具有不同命名空间的区域,并且默认的none区域路由将返回500服务器错误,那么namespaces参数可能不够。

routes.MapRoute(
     "Default", // Route name
     "{controller}/{action}/{id}", // URL with parameters
     new { controller = "Home", action = "Index", id = UrlParameter.Optional }, // Parameter defaults
     new string[] { "MyCompany.MyProject.WebMvc.Controllers"}
);

最好覆盖默认的路由处理程序并添加以下行:

RequestContext.RouteData.DataTokens["UseNamespaceFallback"] = false;

0

在添加对具有相同路线的另一个项目的引用后,出现了此问题,并且在删除引用后问题仍然存在。

通过从bin文件夹中删除添加的引用的.dll文件并重建来解决。


0

像许多其他人一样,从VS2017菜单创建新的MVC模板项目后,在构建项目时,我会收到op的错误消息。然后,我使用cooloverride在此线程中早些时候发布的答案https://stackoverflow.com/a/15651619/2417292 针对mvc4项目。这仍然不能解决我的问题,因此我将主视图文件夹和HomeController文件重命名为视图文件夹Company /和控制器文件CompanyController。然后这对我有用,不是说一个修复,而是一个解决方法,如果您不坚持使用Home / Index路由,我的另一个问题是我找不到导致错误的引用,并且由于我的开发平台是Azure WebApplication vs.具有完整文件系统和IIS设置的完整VM。



By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.