发现多个类型与名为'Home'的控制器匹配

我目前有两个不相关的MVC3项目在线托管。

一个正常工作,另一个不起作用,给我错误:

发现多个类型与名为'Home'的控制器相匹配。 如果为该请求提供服务的路由('{controller} / {action} / {id}')没有指定命名空间来搜索与该请求匹配的控制器,就会发生这种情况。

如果是这种情况,请通过调用带有'namespaces'参数的'MapRoute'方法的重载来注册此路由。

我的托管人的工作方式是他给了我FTP访问权限,在该文件夹中我有两个其他文件夹,每个文件夹对应我的每个应用程序。

ftpFolderA2 / foo.com

ftpFolderA2 / bar.com

foo.com工作正常,我发布我的应用程序到我的本地文件系统,然后FTP的内容,它的工作原理。

当我上传并尝试运行bar.com时,上述问题触发并阻止我使用我的网站。 虽然foo.com仍然有效

bar.com是否从ftpFolderA2内部的各个控制器进行搜索,这就是为什么它找到另一个HomeController ? 我怎么才能告诉它只查看Controller文件夹?

事实:

  • 不使用区域。 这是两个完全无关的项目。 我将每个发布的项目放到每个相应的文件夹中 没有什么花哨。
  • 每个项目只有1个HomeController。
  • 有人可以证实这是问题吗?


    当您使用区域并且在区域和根目录中具有相同的控制器名称时,通常会出现此错误消息。 例如,你有两个:

  • ~/Controllers/HomeController.cs
  • ~/Areas/Admin/Controllers/HomeController.cs
  • 为了解决这个问题(如错误消息所暗示的那样),您可以在声明路由时使用命名空间。 所以在Global.asax的主要路由定义中:

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

    并在你的~/Areas/Admin/AdminAreaRegistration.cs

    context.MapRoute(
        "Admin_default",
        "Admin/{controller}/{action}/{id}",
        new { action = "Index", id = UrlParameter.Optional },
        new[] { "AppName.Areas.Admin.Controllers" }
    );
    

    如果您没有使用区域,那么您的两个应用程序似乎都托管在同一个ASP.NET应用程序中,并且会发生冲突,因为您在不同的命名空间中定义了相同的控制器。 如果您想避免此类冲突,则必须将IIS配置为将这两者作为单独的ASP.NET应用程序托管。 如果您无法访问服务器,请询问您的托管服务提供商。


    以下是另一个可能会遇到此错误的场景。 如果您重命名项目以使程序集的文件名发生更改,则可能有两个版本的ASP.NET程序集,这会重现此错误。

    解决方案是转到bin文件夹并删除旧的dll。 (我尝试过“重建项目”,但这并没有删除它们,所以请确保检查bin以确保它们不在)


    在MVC4和MVC5中有点不同,请使用以下内容

    /App_Start/RouteConfig.cs

    namespace MyNamespace
    {
        public class RouteConfig
        {
            public static void RegisterRoutes(RouteCollection routes)
            {
                routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
    
                routes.MapRoute(
                    name: "Default",
                    url: "{controller}/{action}/{id}",
                    defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },
                    namespaces:  new[] {"MyNamespace.Controllers"}
                );
            }
        }
    }
    

    和地区

    context.MapRoute(
                    "Admin_default",
                    "Admin/{controller}/{action}/{id}",
                    new { action = "Index", id = UrlParameter.Optional },
                    new[] { "MyNamespace.Areas.Admin.Controllers" }
                );
    
    链接地址: http://www.djcxy.com/p/89385.html

    上一篇: Multiple types were found that match the controller named 'Home'

    下一篇: Why c# decimals can't be initialized without the M suffix?