Могу ли я использовать контроллер и ApiController для одного и того же?
Я только начал использовать VS 2012 RC, и я создаю веб-приложение ASP.NET MVC 4, в котором я планирую предоставить как пользовательский интерфейс на основе HTML, так и интерфейс программирования на основе WebApi.
Для моего веб-сайта HTML у меня есть контроллер и просмотр для каждой из моих моделей (MVC!), а маршрутизация работает "по соглашению", так что, например, URL /client
подключается к моему ClientController
, Мой ClientController
происходит от Controller
.
Для моего API я создам новые контроллеры, которые выводятся из ApiController
. Я, естественно, хочу, чтобы мои URL-адреса API были похожи на мои URL-адреса HTML, поэтому я хотел бы, чтобы информация о клиенте была доступна в /api/client
. Тем не менее, с помощью маршрутизации по соглашению, это предполагает, что мне нужен ApiController с именем ClientController
. И у меня уже есть класс ClientController
.
Как я могу справиться с этим? Нужна ли мне обычная маршрутизация? Я помещал классы API в другое пространство имен, чтобы я мог дать им одно и то же имя?
Обновление: Этот вопрос, похоже, говорит о том, что мне нужно другое пространство имен для моих контроллеров API: Смешать веб-api-контроллеры и контроллеры сайтов
Ответы
Ответ 1
Все, что требуется для классов контроллера, находится в другом пространстве имен, и все хорошо.
Использование областей MVC также будет работать (как указано в комментарии gordonml), но это эффективно помещает контроллеры в разные пространства имен, поэтому это более формальный способ достижения того же результата.
Ответ 2
Вы можете взглянуть на следующий пост в блоге, который иллюстрирует, как контроллер Api мог также использовать представления Razor. В основном он использует RazorEngine, чтобы проанализировать конец представления Razor.
Ответ 3
Для тех, кто ищет пошаговые инструкции о том, как это сделать в проекте WebApi:
- Создайте две папки/пространства имен, а именно:
ControllersApi
и ControllersWeb
- Щелкните правой кнопкой мыши на
ControllersWeb
и выберите Add -> Controller
и выберите MVC 5 Controller - Empty
. Это добавит все другие зависимости, если у вас их нет в проекте WebApi.
- Теперь ваш
RouteConfig
зарегистрирует те классы, которые наследуются от базового класса Controller
. Вероятно, вам нужно будет добавить ссылку на контроллер по умолчанию, отредактировав значения по умолчанию: defaults: new { action = "Index", controller = "Home", id = UrlParameter.Optional }
Чтобы он, теперь вы можете запускать сайт и использовать как API, так и Web-контроллеры.