2013-10-08 4 views
2

У меня есть MVC 4 WebSite несколько областей ... I'm с помощью маршрутизации по умолчанию все созданное VS2012 ...MVC 4 маршрутизации «найти» контроллеры внутри зоны

Таким образом, я могу получить доступ (от Area1):

Area1/ControllerX/ActionX 

у меня есть несколько контроллеров без Площадь, так что я могу получить доступ к:

ControllerY/ActionY 

Все нормально ... Но, если я пытаюсь получить доступ к ControllerX без Area1, как это:

ControllerX/ActionX 

Я получил эту ошибку:

Exception: The view 'ActionX' or its master was not found or no view engine supports the 
searched locations. The following locations were searched: ~/Views/mangavagao/ActionX.cshtml 
~/Views/Shared/ActionX.cshtml 
Controller: ControllerX 
Action: ActionX 

Я ожидал не найдена ошибка 404 ... Почему этот маршрут был захвачен?

-

маршрут Площадь:

context.MapRoute(
      "Area1_default", 
      "Area1/{controller}/{action}/{id}", 
      new { controller = "ControllerX", action = "ActionY", id = UrlParameter.Optional } 
); 

маршрут по умолчанию:

routes.MapRoute(
      name: "Default", 
      url: "{controller}/{action}/{id}", 
      defaults: new { controller = "ControllerY", action = "ActionY", id = UrlParameter.Optional ); 
+0

Итак, 'ControllerX' находится в' Area1', но 'ControllerY' является стандартным контроллером, это правильно? –

+0

Да, у контроллера нет области. – Paul

ответ

5

Добавьте параметр namespaces в функции от MapRoute по умолчанию. Затем установите UseNamespaceFallback datatoken на false.

routes.MapRoute(
    name: "Default", 
    url: "{controller}/{action}/{id}", 
    defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }, 
    namespaces: new string[] { "MvcApplication.Controllers" } 
    ).DataTokens["UseNamespaceFallback"] = false; 
  1. namespaces параметр установлен на приоритет вывода контроллера, когда несколько контроллера с тем же именем существует.

  2. MVC по-прежнему будет искать контроллер за пределами этого пространства имен, если совпадение не найдено в пространстве имен.

  3. UseNamespaceFallback datatoken сообщает MVC игнорировать инструкцию (2).

надеюсь, что это поможет.

+0

Спасибо, отлично работал! – Paul

+0

добро пожаловать. рад, что это помогло. :) – shakib

0

Попробуйте карту маршрута область с пространством имен:

context.MapRoute(
      "Area1_default", 
      "Area1/{controller}/{action}/{id}", 
      new { controller = "ControllerX", action = "ActionY", id = UrlParameter.Optional }, 
      new[] { "App.Areas.AreaName.Controllers" } 
); 

Изменение App и AreaName к соответствующим значениям.

+0

Добавлено пространство имен в обоих случаях, такое же поведение! – Paul

+0

Получается ли точка останова в 'ActionX' в' ControllerX', когда вы вызываете ее без 'Area1'? –

+0

Да ... Я не понимаю, почему он попал туда ... – Paul

0

Это похоже на этот вопрос: Not including area name in URL results in "The view 'Index' or its master was not found" instead of 404

В вашем случае пространств имен должны быть добавлены в маршрут по умолчанию, а не маршрут область. Пространство имен в этом случае не должно ссылаться на контроллеры области. Что-то, как это должно работать:

routes.MapRoute(
    "Default", // Route name 
    "{controller}/{action}/{id}", // URL with parameters 
    new { controller = "Home", action = "Index", id = UrlParameter.Optional }, // Parameter defaults 
    null, // object constraints 
    new string[] { "Namespace.Application.Controllers" } // namespaces 
); 
+0

Я пробовал пространство имен в обоих, и ничего не меняется ... Пробовал поместить только по умолчанию, ничего не изменилось ... – Paul

Смежные вопросы