ChatGPT解决这个技术问题 Extra ChatGPT

在我的项目中存在多个同名控制器的问题

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

找到了与名为“Home”的控制器匹配的多种类型。如果为该请求提供服务的路由 ('Home/{action}/{id}') 未指定命名空间来搜索与请求匹配的控制器,则可能会发生这种情况。如果是这种情况,请通过调用采用“namespaces”参数的“MapRoute”方法的重载来注册此路由。 'Home' 的请求找到了以下匹配的控制器: 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 }
        );
    }

这一切都导致了我在本文开头强调的错误。我正在努力尝试从其他各种帖子中拼凑出一个解决方案,但没有运气。

是否可以在默认控制器文件夹中有一个 HomeController,然后在每个区域中有一个?如果是这样,我是否需要(假设我这样做)更改我的配置文件以使其工作?

任何帮助将非常感激!

请参阅此stackoverflow.com/a/12633541/2089963。这个对我有用
当我重命名项目/程序集时,这发生在我身上,我只是删除了 bin 文件夹并重新编译项目,它工作正常。

D
David Ruttka

错误消息包含推荐的解决方案:“如果是这种情况,请通过调用采用 '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 的索引操作,如区域注册中所定义。


我没有测试过,但是 namespaces 参数是一个字符串数组,所以你应该可以通过添加到数组中来传递任何数字:new string[] { "MyCompany.MyProject.WebMvc.Controllers", "My.Second.Namespace", "My.Third.Namespace", "Namespaces.Etc" }
那个命名空间模式对我不起作用。 MyProject.Controllers 但确实如此。
我试过这个。但是这个类中的索引MyCompany.MyProject.WebMvc.Areas.Company.Controllers.HomeController正在执行。但出现的视图是旧的。
由于类型推断和变量含义,这里的第 4 个参数可能会有点令人困惑,这并不值得。第 4 个参数可以是一个按命名空间进行约束的字符串数组,一个添加 IRouteConstraints 的对象或可以解释为约束的字符串,或者您可以有 5 个参数并同时包含这两个参数。 aspnetwebstack.codeplex.com/SourceControl/changeset/view/…
另外值得注意的是,默认情况下,路径会找到通往其他命名空间的路径 - 如果您想锁定一个命名空间或一组命名空间的路径,则必须禁用此后备:bubblogging.wordpress.com/2012/06/09/mvc-routing-namespaces(页面底部)
c
cooloverride

这是 asp.net mvc4 方法:

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

谢谢,这为我解决了这个问题,尽管我一生都无法弄清楚为什么我的应用程序首先认为有两个家庭控制器。我对命名空间进行了搜索和替换,这似乎导致了问题,但是搜索整个解决方案并没有显示任何流氓命名空间的实例。
好吧,我找到了我的问题的原因。希望这可以帮助其他人拼命寻找,就像我今天一样。因为我已经更改了应用程序的名称(以及命名空间),所以 bin 文件夹中仍然有一个 DLL 没有被清理删除。幕后一定有一些 MEF 魔术。一旦我发现并删除了旧的 DLL,问题就消失了。难怪文本搜索没有找到它!
@YannDuran,遇到了类似的问题,您的修复有所帮助。谢谢。
R
Reynaldo

我已经重命名了命名空间,所以,我只删除了 de 文件夹 bin 和 obj 并重建,再次工作。


L
Leonel Sanches da Silva

如果您使用的是 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
    }

C
Community

这个问题的另一个可能的原因可以在下面找到:

Multiple types were found that match the controller named 'Home'


B
Ben

用这个

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

a
allen213

仅使用项目名称:

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

P
Pavan Somarathne

我有同样的问题,发现旧版本在“bin”文件夹中创建了编译文件。

一旦我删除了这些错误就消失了。


删除“bin”和“obj”文件夹的内容为我完成了这项工作。
X
XzaR

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

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;

L
Logan Miller

在我添加对具有相同路由的另一个项目的引用后,我遇到了这个问题,并且在我删除引用后问题继续存在。

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


E
Eddie.Power_AU

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


P
Prince Painadath Jose

对于 MVC5,下面的代码适用于为不同区域发出相同的控制器名称。您必须指定必须首先击中哪个区域控制器。

        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },
             new[] { "ApplicationName.Areas.AreaName.Controllers" }
        ).DataTokens.Add("area", "AreaName");

E
Esaith

这个问题是我不小心添加的时候出现的

[Route("api/[controllers]s")]

代替

[RoutePrefix("api/[controllers]s")]

到我的 ApiController 的顶部。


关注公众号,不定期副业成功案例分享
关注公众号

不定期副业成功案例分享

领先一步获取最新的外包任务吗?

立即订阅