Возникла проблема с несколькими контроллерами с одинаковым именем в моем проекте


96

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

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

Запрос на «Домашнюю страницу» обнаружил следующие подходящие контроллеры: 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
        );
    }

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

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

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

Любая помощь приветствуется!


Обратитесь к этому stackoverflow.com/a/12633541/2089963 . У меня это работает,
Сайед Мохамед

Это случилось со мной, когда я переименовал проект / сборку, я просто удалил папку bin и перекомпилировал проект, и он работал нормально.
Core

Ответы:


167

В сообщении об ошибке содержится рекомендуемое решение: «В этом случае зарегистрируйте этот маршрут, вызвав перегрузку метода 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 перейдет к действию Index HomeController области Company, как определено в регистрации области.


1
Я не тестировал его, но namespacesпараметр представляет собой массив строк, поэтому вы должны иметь возможность передавать любое число, добавляя в массив:new string[] { "MyCompany.MyProject.WebMvc.Controllers", "My.Second.Namespace", "My.Third.Namespace", "Namespaces.Etc" }
Дэвид Руттка,

2
Этот шаблон пространства имен не работал у меня. MyProject.Controllersоднако сделал.
The Muffin Man

Я пробовал это. Но индекс в этом MyCompany.MyProject.WebMvc.Areas.Company.Controllers.HomeControllerклассе выполняется. Но вид появляется старый.
kbvishnu

Ничего не стоит, потому что 4-й параметр здесь может немного сбивать с толку из-за вывода типа и значения переменной. Четвертым параметром может быть массив строк для ограничения пространством имен, объект для добавления IRouteConstraints ИЛИ строки, которые можно интерпретировать как ограничения, или вы можете иметь 5 параметров и включать оба. aspnetwebstack.codeplex.com/SourceControl/changeset/view/…
Крис Москини,

Также стоит отметить, что по умолчанию путь найдет путь к другим пространствам имен - если вы хотите заблокировать путь к пространству имен или набору пространств имен, вам необходимо отключить этот резерв : bubblogging.wordpress.com/2012/06/09/mvc- routing-namespaces (внизу страницы)
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

12
Что ж, я нашел причину своей проблемы. Надеюсь, это может помочь кому-то другому, отчаянно ищущему, как я сегодня. Поскольку я изменил имя приложения (а также пространство имен), в папке bin все еще оставалась DLL, которая не была удалена при чистке. Должно быть, под одеялом творится какая-то магия MEF. Как только я обнаружил и удалил старую DLL, проблема исчезла. Неудивительно, что текстовый поиск его не нашел!
Yann Duran

@YannDuran, столкнулся с аналогичной проблемой, и ваше исправление помогло. Спасибо.
Клаус Нджи 03

12

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



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

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

0

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

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


0

Как и у многих других, у меня возникла эта проблема после создания нового проекта шаблона MVC из меню VS2017, при создании проекта я получал сообщение об ошибке op. Затем я использовал ответ https://stackoverflow.com/a/15651619/2417292, опубликованный ранее в этой теме от cooloverride для проектов mvc4. Это все еще не устранило мою проблему, поэтому я переименовал свою папку Home view и файл HomeController в папку просмотра Company / и файл контроллера CompanyController. Затем это сработало для меня, а не как исправление, а как обходной путь, если вы не застряли на маршруте Home / Index, моя другая проблема заключалась в том, что я не мог найти ссылку, вызывающую ошибку, и из-за того, что моя платформа разработки была Azure WebApplication против полная виртуальная машина с полной файловой системой и настройками IIS, с которыми можно возиться.


0

У меня была такая же проблема, и я обнаружил, что более старая версия создавала скомпилированные файлы в папке «bin».

Как только я удалил их, ошибка исчезла.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.