Проблема с несколькими контроллерами с таким же именем в моем проекте

Я запускаю следующую ошибку с моим проектом ASP.NET MVC 3:

Было найдено несколько типов, которые соответствуют контроллер с именем "Главная". Это может произойдет, если маршрут, обслуживающий этот request ('Home/{action}/{id}') делает не указывать пространства имен для поиска контроллер, соответствующий запросу. Если это так, зарегистрируйте это маршрута, вызвав перегрузку Метод "MapRoute", который принимает 'namespaces'.

Запрос "Home" нашел после согласования контроллеров: MyCompany.MyProject.WebMvc.Controllers.HomeController MyCompany.MyProject.WebMvc.Areas.Company.Controllers.HomeController

У меня есть HomeController в моей папке контроллера по умолчанию, с именем класса MyCompany.MyProject.WebMvc.Controllers.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
        );
    }

Затем у меня есть область под названием "Компания" с 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 }
        );
    }

Это все приводит к ошибке, которую я выделил в начале этого сообщения. Я изо всех сил пытаюсь объединить решение из разных других сообщений, НЕТ УДАЧИ.

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

Любая помощь будет очень признательна!

Ответ 1

Сообщение об ошибке содержит рекомендуемое решение: "Если это так, зарегистрируйте этот маршрут, вызвав перегрузку метода" 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, который, я думаю, вам нужен. http://server/company/home перейдет в область действия HomeController компании, как определено в области регистрации.

Ответ 2

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

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

Ответ 3

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

Ответ 5

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

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

Ответ 6

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

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

Ответ 7

Если вы используете 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
    }

Ответ 8

Как отметил Крис Москини, параметра 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;

Ответ 9

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

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

Ответ 10

Как и многие другие, у меня возникла эта проблема после создания нового шаблона проекта MVC из меню VS2017, при создании проекта я получал сообщение об ошибке op. Затем я использовал ответ fooobar.com/info/65342/..., опубликованный ранее в этой теме cooloverride для проектов MVC4. Это по-прежнему не решало мою проблему, поэтому я переименовал свою папку Home view и файл HomeController в папку просмотра Company/и файл контроллера CompanyController. Тогда это сработало для меня, не исправление, скажем так, а обходной путь, если вы не застряли на маршруте Home/Index. Моя другая проблема заключалась в том, что я не смог найти ссылку, вызывающую ошибку, и из-за того, что моей платформой разработчика было Azure WebApplication против полная виртуальная машина с полной файловой системой и настройками IIS.