Возникла проблема с несколькими контроллерами с одним именем в моем проекте - PullRequest
94 голосов
/ 23 февраля 2011

Я столкнулся со следующей ошибкой в ​​моем проекте ASP.NET MVC 3:

Обнаружено несколько типов, соответствующих контроллеру с именем "Home".Это может произойти, если маршрут, который обслуживает этот запрос («Home / {action} / {id}»), не указывает пространства имен для поиска контроллера, соответствующего запросу.В этом случае зарегистрируйте этот маршрут, вызвав перегрузку метода «MapRoute», который принимает параметр «пространства имен».

В запросе «Home» обнаружены следующие подходящие контроллеры: MyCompany.MyProject.WebMvc.Controllers.HomeController MyCompany.MyProject.WebMvc.Areas.Company.Controllers.HomeController

У меня есть HomeController в папке контроллера по умолчанию с именем класса MyCompany.MyProject.WebMvC.HomeController.

Мой метод RegisterRoutes в моем global.asax выглядит следующим образом:

    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.

Метод RegisterArea в файле CompanyAreaRegistration выглядит так:

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

Все это приводит к ошибке, которую я выделилв начале этого поста.Я изо всех сил пытаюсь собрать воедино решение из других постов, с NO LUCK .

Возможно ли иметь HomeController в папке контроллеров по умолчанию, а затем в КАЖДОЙ области?Если да, нужно ли мне вносить (если я делаю) изменения в мой файл конфигурации, чтобы эта работа работала?

Любая помощь будет высоко ценится!

Ответы [ 9 ]

163 голосов
/ 23 февраля 2011

В сообщении об ошибке содержится рекомендуемое решение: «В этом случае зарегистрируйте этот маршрут, вызвав перегрузку метода« MapRoute », который принимает параметр« 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"}
);

Это заставит http://server/ перейти к действию Index вашего HomeController, которое, я думаю, то, что вы хотите. http://server/company/home перейдет к действию Индекс HomeController в области Компании, как определено при регистрации области.

28 голосов
/ 27 марта 2013

Это подход asp.net mvc4:

 routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "RegisterNow", id = UrlParameter.Optional },
            namespaces: new[] { "YourCompany.Controllers" }
        );
10 голосов
/ 06 декабря 2016

Я переименовал пространства имен, поэтому я только удаляю папки bin и obj и перестроил , работаю снова.

2 голосов
/ 24 октября 2013

используйте это

routes.MapRoute(
            "Default",
            "{controller}/{action}/{id}",
            new { controller = "Home", action = "Index", id = UrlParameter.Optional },
            new[] { "ProjectName.Controllers" }
        );
2 голосов
/ 24 сентября 2013

Другая вероятная причина этой проблемы может быть найдена ниже:

Найдено несколько типов, соответствующих контроллеру с именем 'Home'

1 голос
/ 17 августа 2016

Если вы используете 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
    }
1 голос
/ 09 октября 2013

Используйте только название проекта:

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
0 голосов
/ 12 апреля 2019

У меня возникла эта проблема после того, как я добавил ссылку на другой проект с такими же маршрутами, и проблема продолжилась после того, как я удалил ссылку.

Решено путем удаления DLL-файла этой добавленной ссылки из папки bin и перестройки.

0 голосов
/ 10 апреля 2018

Как отметил Крис Москини, параметра namespaces может быть недостаточно, если у вас есть две области с одинаковым именем контроллера с разными пространствами имен, а маршрут по умолчанию без области вернет 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;
...