Было найдено несколько типов, которые соответствуют контроллеру с именем 'Home' - PullRequest
297 голосов
/ 21 октября 2011

В настоящее время у меня есть два несвязанных проекта MVC3, размещенных в сети.

Один работает нормально, другой не работает, выдавая ошибку:

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

Если это так, зарегистрируйте этот маршрут, вызвав перегрузку метода 'MapRoute', который принимает параметр 'namespaces'.

Способ работы моего хостера заключается в том, что ондает мне доступ по FTP, и в этой папке у меня есть две другие папки, по одной для каждого из моих приложений.

ftpFolderA2 / foo.com

ftpFolderA2 / bar.com

foo.com работает нормально, я публикую свое приложение в локальной файловой системе, затем отправляю по FTP содержимое, и оно работает.

Когда я загружаю и пытаюсь запустить bar.com, возникает проблема выше имешает мне использовать мой сайт. Все время, пока foo.com все еще работает .

Ищет ли bar.com ВЕЗДЕ из контроллеров внутри ftpFolderA2, и поэтому он находит еще один HomeController?Как я могу сказать, чтобы он смотрел только в папке «Контроллер» так, как должен?

Факты:

  1. Не используются области.Это два ПОЛНОСТЬЮ не связанных проекта.Я помещаю каждый опубликованный проект в каждую соответствующую папку.Ничего особенного.
  2. В каждом проекте есть только 1 HomeController.

Может кто-нибудь подтвердить, что это проблема?

Ответы [ 26 ]

511 голосов
/ 28 сентября 2012

Вот еще один сценарий, в котором вы можете столкнуться с этой ошибкой.Если вы переименуете свой проект так, что имя файла сборки изменится, возможно, у вас будет две версии сборки ASP.NET, которые будут воспроизводить эту ошибку.

Решение состоит в том, чтобы перейти в папку bin и удалить старые библиотеки DLL.(Я пробовал «Перестроить проект», но он не удалил их, поэтому обязательно проверьте bin, чтобы убедиться, что они пропали)

453 голосов
/ 21 октября 2011

Это сообщение об ошибке часто появляется, когда вы используете области, и у вас есть то же имя контроллера внутри области и корня. Например, у вас есть два:

  • ~/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, если вы хотите избежать подобных конфликтов. Попросите вашего хостинг-провайдера об этом, если у вас нет доступа к серверу.

58 голосов
/ 20 октября 2014

В 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" }
            );
39 голосов
/ 06 июля 2012

Смотреть это ... http://www.asp.net/mvc/videos/mvc-2/how-do-i/aspnet-mvc-2-areas

Тогда эта картинка (надеюсь, вам понравятся мои рисунки)

enter image description here

29 голосов
/ 30 ноября 2014

То, что говорили другие, верно, но для тех, кто все еще сталкивается с той же проблемой:
В моем случае это произошло потому, что я скопировал другой проект и переименовал его в другое НО предыдущие выходные файлы в папке bin все еще были там ... И, к сожалению, после нажатия кнопки Build -> Clean Solution после переименования проекта и Namespaces не удаляет их ... поэтому удаление их вручную решило мою проблему!

23 голосов
/ 20 июля 2014

Проверьте папку bin , если есть другой файл dll, который может конфликтовать с классом homeController.

21 голосов
/ 20 сентября 2017

в вашем проекте bin/ папка

убедитесь, что у вас есть только PROJECT_PACKAGENAME.DLL

и удалите ANOTHER_PROJECT_PACKAGENAME.DLL

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

14 голосов
/ 11 мая 2012

Другим решением является регистрация пространства имен по умолчанию в ControllerBuilder.Поскольку у нас было много маршрутов в нашем основном приложении и только один общий маршрут в наших областях (где мы уже указывали пространство имен), мы обнаружили, что это самое простое решение:

ControllerBuilder.Current
     .DefaultNamespaces.Add("YourApp.Controllers");
7 голосов
/ 21 октября 2011

Даже если вы не используете области, вы все равно можете указать в своей RouteMap, какое пространство имен использовать

routes.MapRoute(
    "Default",
    "{controller}/{action}",
    new { controller = "Home", action = "Index" },
    new[] { "NameSpace.OfYour.Controllers" }
);

Но, похоже, реальная проблема заключается в том, как ваши два приложения настроены в IIS

7 голосов
/ 01 декабря 2011

У меня только что была эта проблема, но только когда я публиковал на своем веб-сайте, на моей локальной отладке она работала нормально.Я обнаружил, что должен был использовать FTP с моего веб-хоста, зайти в мой каталог публикации и удалить файлы в папке BIN, при их локальном удалении ничего не происходило при публикации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...