Проблема с несколькими контроллерами с таким же именем в моем проекте
Я запускаю следующую ошибку с моим проектом 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 снова работайте.
Ответ 4
Еще одна вероятная причина этой проблемы может быть найдена ниже:
Было найдено несколько типов, которые соответствуют контроллеру с именем "Главная"
Ответ 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.