У меня есть сайт MVC 4 с определенными обычными маршрутами по умолчанию (включая маршрут API), а также область для функций администрирования, у которой есть свой собственный маршрут. Конфигурация маршрутизации выглядит так:

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

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

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

routes.MapHttpRoute(
    name: "DefaultApi",
    routeTemplate: "api/{controller}/{id}",
    defaults: new { id = RouteParameter.Optional }
);

Маршрут админки (в коде регистрации зоны):

context.MapRoute(
    "Admin_default",
    "Admin/{controller}/{action}/{id}",
    defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },
    namespaces: new[] { "MyProject.Areas.Admin.Controllers" }
);

Кроме того, в области администрирования есть собственная страница макета для представлений.

Все маршруты для основного сайта работают правильно (включая HTTP-маршруты для контроллеров API), но маршруты для области администратора демонстрируют странное поведение. Запросы к домашнему контроллеру в области администрирования выполняются успешно, а запросы к другим контроллерам в области администрирования - нет. Ошибка, которую я получаю,

System.Web.HttpException: The controller for path '/admin/concerts' was not found or does not implement IController.

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

Я пробовал отлаживать конфигурацию маршрута с помощью Glimpse, но мне не очень повезло, кроме подтверждения с помощью второго носителя, что маршрут работает правильно для HomeController области администрирования, но не для других контроллеров в этой области.

Обновление:

У меня определены следующие соответствующие контроллеры:

  • Маршрут по умолчанию:
    • MyProject.Controllers.ConcertsController
    • MyProject.Controllers.HomeController
    • (Некоторые другие, здесь не актуальны.)
  • Маршрут HTTP по умолчанию:
    • только MyProject.Controllers.Api.ConcertsController
  • Маршрут админки:
    • MyProject.Areas.Admin.Controllers.ConcertsController; и
    • только MyProject.Areas.Admin.Controllers.HomeController
1
alastairs 12 Май 2013 в 22:53
Не могли бы вы поделиться некоторыми подробностями. Как у вас концертный контролер? Эта проблема заключается в том, что все контроллеры в области администрирования находятся в другом доме?
 – 
Guanxi
12 Май 2013 в 23:25
Обновлено по запросу. Единственные два контроллера в области администрирования - это контроллеры Concerts и Home. Домашний контроллер работает; Контроллер Concerts - нет.
 – 
alastairs
12 Май 2013 в 23:37

1 ответ

Лучший ответ

Оказалось, что это вовсе не проблема маршрутизации, а проблема с определениями представлений: каждое из представлений ConcertsController включало оператор Layout, указывающий представление на Layout для основного сайта.

0
alastairs 13 Май 2013 в 00:49