Маршрутизация области в ASP.NET MVC

Я немного запутался с маршрутизацией области. Я создал область под названием Backbone. У меня также есть контроллер по умолчанию, представления и модели.

http://localhost:46870/ 

дает мне следующую ошибку:

Multiple types were found that match the controller named 'home'. This can happen if     
the route that services this request ('{controller}/{action}/{id}') does not specify   
namespaces to search for a controller that matches the request. If this is the case,  
register this route by calling an overload of the 'MapRoute' method that takes a 
'namespaces' parameter.

The request for 'home' has found the following matching controllers:
LearnJavascript.Areas.BackBone.Controllers.HomeController
LearnJavascript.Controllers.HomeController

Вот магистральный маршрут (это пришло с эшафотами, я не вносил никаких изменений):

    public override void RegisterArea(AreaRegistrationContext context) 
    {
        context.MapRoute(
            "BackBone_default",
            "BackBone/{controller}/{action}/{id}",
            new { action = "Index", id = UrlParameter.Optional }
        );
    }

Маршрут по умолчанию (Это пришло с скаффолдингом, я не делал никаких изменений):

    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 }
        );
    }

Я думал, что если URL-адрес не начинается с

http://localhost:46870/Backbone

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

Самая запутанная часть была, когда я назвал этот URL:

http://localhost:46870/home/index

Он показывает мне то же сообщение об ошибке. Почему маршрутизация MVC так сильно запутана в этом.

Я использую VS2013 и MVC5.


person Sumesh Kuttan    schedule 29.07.2014    source источник
comment
даже в разных областях нельзя иметь 2 контроллера с одинаковым именем.   -  person Matt Bodily    schedule 29.07.2014
comment
Я думал, что наличие одинаковых имен контроллеров было основной целью создания области.   -  person Sumesh Kuttan    schedule 29.07.2014
comment
Пожалуйста, проверьте [Обнаружено несколько типов, соответствующих контроллеру с именем "Home"][1] [1]: stackoverflow.com/questions/7842293/   -  person Hamid Bahmanabady    schedule 29.07.2014
comment
@HamidBahmanabady Я добавил пространство имен в глобальный маршрут, и он начал нормально работать. благодаря.   -  person Sumesh Kuttan    schedule 29.07.2014
comment
@MattBodily У нас может быть одно и то же имя контроллера в областях. Это одна из основных целей наличия областей. Я только что создал другую область и дважды проверил ее. :)   -  person Sumesh Kuttan    schedule 29.07.2014
comment
Я думал, что если URL-адрес не начинается с [Backbone], магистральная область не будет называться домашней. На самом деле все наоборот. Если вы используете URL-адрес с префиксом Backbone, двусмысленности нет, и вызывается правильный контроллер. Но в противном случае все домашние контроллеры потенциально могут совпадать, поэтому вам нужно указать пространство имен на маршруте, чтобы устранить двусмысленность.   -  person Chris Pratt    schedule 30.07.2014
comment
@ChrisPratt Использование префикса магистрали устраняет двусмысленность. Но когда URL-адрес вызывается без префикса магистрали, я думаю, что совершенно очевидно (по крайней мере, для меня), что он должен относиться к маршруту за пределами области. Почему MVC смущен этим. Совершенно ясно, что если мне нужен контроллер области, я буду звонить с префиксом имени области.   -  person Sumesh Kuttan    schedule 30.07.2014
comment
Не обязательно. Видите, физический путь контроллера не имеет значения. После того, как они скомпилированы, физического пути больше нет. Теперь они, скорее всего, будут в разных пространствах имен, но когда инфраструктура маршрутизации запустится, она просто запрашивает контроллеры, в основном все, что наследуется от Controller, и ищет их, чтобы найти действие для обработки маршрута. Ваш локальный маршрут определяет конкретное пространство имен для поиска, поэтому двусмысленности нет, но ваш маршрут по умолчанию — нет, поэтому любой домашний контроллер, независимо от того, в каком пространстве имен он находится, соответствует.   -  person Chris Pratt    schedule 30.07.2014
comment
@ChrisPratt Хороший момент. Обосновывает необходимость пространства имен.   -  person Sumesh Kuttan    schedule 01.08.2014


Ответы (2)


Я получил правильный ответ от Хамида Бахманабади.

Я добавил пространство имен в глобальный маршрут, и он начал работать нормально.

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

и

        context.MapRoute(
            "BackBone_default",
            "BackBone/{controller}/{action}/{id}",
            new { action = "Index", id = UrlParameter.Optional },
            new[] { "Test.Areas.Backbone.Controllers" }
person Sumesh Kuttan    schedule 30.07.2014
comment
привет, я попробовал ваш код, но снова появляется ошибка Запрос «Здоровье» нашел следующие соответствующие контроллеры: Appname.Areas.Admin.Controllers.HealthController Appname.Controllers.HealthController, Что мне делать ? - person Karthic G; 26.09.2016

попробуй это,

В route.config

routes.MapRoute(
        name: "Default",
        url: "{controller}/{action}/{id}",
        defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },
        namespaces: new string[] { "Test.Controllers"}

и раздел администратора --> AdminAreaRegistration.cs

  context.MapRoute(
        "BackBone_default",
        "BackBone/{controller}/{action}/{id}",
        new { action = "Index", id = UrlParameter.Optional },
        new string[] { "Test.Areas.Backbone.Controllers" }
person Community    schedule 26.09.2016