Виникли проблеми з кількома контролерами з однаковим ім’ям у моєму проекті


96

У мене виникає така помилка з моїм проектом ASP.NET MVC 3:

Було знайдено декілька типів, які відповідають контролеру з назвою "Дім". Це може статися, якщо в маршруті, який обслуговує цей запит ('Головна / {дія} / {ідентифікатор'), не вказані простори імен для пошуку контролера, який відповідає запиту. Якщо це так, зареєструйте цей маршрут, викликавши перевантаження методу 'MapRoute', який приймає параметр 'простори імен'.

Запит на "Домашня сторінка" знайшов такі відповідні контролери: 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 ", який приймає параметр" простори імен "."

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 перейде до дії Index Index HomeController в області компанії, як визначено в реєстрації області.


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

2
Цей шаблон простору імен для мене не працював. MyProject.Controllersвтім зробив.
Людина з

Я спробував цей. Але індекс у цьому MyCompany.MyProject.WebMvc.Areas.Company.Controllers.HomeControllerкласі виконується. Але Погляд з'являється старий.
kbvishnu

Нічого не варте того, що 4-й параметр тут може трохи заплутати через висновок типу та значення змінної. Четвертим параметром може бути масив рядків для обмеження простором імен, об'єкт для додавання IRouteConstraints АБО рядки, які можна інтерпретувати як обмеження, або ви можете мати 5 параметрів і включати обидва. aspnetwebstack.codeplex.com/SourceControl/changeset/view/…
Кріс

Також варто зазначити, що шлях за замовчуванням знайде шлях до інших просторів імен - якщо ви хочете заблокувати шлях до простору імен або набору просторів імен, вам слід відключити цю резервну копію: bubblogging.wordpress.com/2012/06/09/mvc- простори імен маршрутизації (внизу сторінки)
Кріс Москіні,

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
дякую, це вирішило це для мене, хоча я не можу зрозуміти все своє життя, чому моя програма вважає, що в першу чергу є два домашніх контролери. Я зробив пошук і заміну простору імен, який, здається, спричинив проблему, але пошук усього рішення не показує жодних екземплярів простого простору імен.
Янн Дюран,

12
Ну, я знайшов причину своєї проблеми. Сподіваємось, це може допомогти комусь ще відчайдушно шукати, як це було сьогодні. Оскільки я змінив назву програми (а також простір імен), у папці bin все ще залишалася DLL, яка не видалялася очищенням. Під ковдрою має бути якась магія MEF. Як тільки я виявив і видалив стару DLL, проблема зникла. Не дивно, що текстовий пошук не знайшов його!
Янн Дюран,

@YannDuran, зіткнувся з подібною проблемою, і ваша фіксована допомога допомогла. Дякую.
Klaus Nji

12

Я перейменував простір імен, тому, я тільки видалити де папки бін і 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

Оскільки Кріс Москіні згадує параметр простору імен, може бути недостатньо, якщо у вас є дві області з однаковим ім'ям контролера з різними просторами імен, і за замовчуванням маршрут до жодної області поверне 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, при побудові проекту я отримав би повідомлення про помилку оператора. Потім я використав відповідь https://stackoverflow.com/a/15651619/2417292, опубліковану раніше в цій темі, cooloverride для проектів mvc4. Це все ще не вирішило моєї проблеми, тому я перейменував папку домашнього перегляду та файл HomeController на папку подання Company / та файл контролера CompanyController. Потім це спрацювало для мене, а не виправлення на слово, а обхідний шлях, якщо ви не застрягли на маршруті Домашня сторінка / Індекс, іншою моєю проблемою було те, що я не зміг знайти посилання, що спричинило помилку, і через те, що моєю платформою розробника є Azure WebApplication vs повна віртуальна машина з повною файловою системою та налаштуваннями IIS, з якими можна возитися.


0

У мене була та сама проблема, і я виявив, що в попередній версії створені скомпільовані файли в папці "bin".

Після того, як я їх видалив, помилка зникла.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.