2014-11-25 3 views
6

Я реализую веб-API REST. Я использую примеры из Pro ASP.NET MVC5 от Адама Фримена в качестве отправной точки, но приспосабливая его к способу веб-API.Проблемы с попыткой вернуть представление с помощью контроллера API

Ниже мой код:

public class AdminController : ApiController 
{   
    private IUserRepository _repository; 
    public AdminController(IUserRepository repository) 
    { 
     _repository = repository; 
    } 

    public ActionResult Index() 
    { 
     return View(_repository.Users); 
    } 
} 

В книге AdminController реализован Controller не ApiController, но если я это сделаю, то я получаю ошибки о так как нет никакого конструктора без параметров. Мне нужен конструктор, чтобы принимать параметры, чтобы я мог вставлять зависимости. Поэтому я перешел на ApiController, но теперь он не узнает View.

Что мне нужно использовать вместо View для ApiController?

Я нашел this question, но ответ был в основном «вам не нужно использовать ApiController здесь, просто используйте Controller», чтобы это не помогло мне.

+1

[Разница между ApiController и контроллером в ASP.NET MVC] (http://stackoverflow.com/q/9494966/2974754) – Yuriy

+0

Вы не возвращаются Просмотр из контроллера API. Но вы можете возвращать данные API с контроллера MVC. Решение было бы исправить ошибки, а не пытаться взломать контроллер API. Аргументы конструктора, безусловно, могут быть использованы в контроллерах для инъекции зависимостей. Возможно, вы неправильно подключили преобразователь зависимостей? – David

+0

BTW вы можете вводить в 'ApiController' и' Controller', но вы хотите 'Controller' –

ответ

11

Вы имеете две разные проблемы. Давайте решать их отдельно.

1. Нужно ли мне использовать ApiController или Диспетчерская ?:

Кто-то уже это ответил здесь: Difference between ApiController and Controller in ASP.NET MVC.

The first major difference you will notice is that actions on Web API controllers do not return views, they return data.

ApiControllers are specialized in returning data. For example, they take care of transparently serializing the data into the format requested by the client.

Итак, если вы хотите вернуть View вам нужно использовать простой ПР»Controller. «Путь» WebApi похож на веб-сервис, где вы обмениваетесь данными с другой услугой (возвращая JSON или XML для этой услуги, не вид). Поэтому всякий раз, когда вы хотите вернуть веб-страницу (View) для пользователя, вы не используете веб-API.

Другими словами, веб-API представляет собой возврат данных к другой службе (для возврата JSON или XML), а не к пользователю.

2. Но если я использую контроллер, то получаю ошибки «без параметров».

Хорошо, теперь у нас есть ваша настоящая проблема. Не пытайтесь изобретать колесо и сражаться с ASP.NET, чтобы делать инъекции зависимостей! Инструмент уже существует, чтобы разрешить инъекцию зависимостей и отсортировать ошибку «без параметров»: Ninject.

Если вы уже используете Ninject и все еще получаете эту ошибку, вы делаете что-то неправильно с Ninject. Попробуйте повторить шаги по установке и настройке, а также увидеть some tutorials или questions about parameterless error with Ninject use

+0

Я уже использую Ninject, и у меня все еще есть ошибка. – starsplusplus

+0

Также см. Мой запрос [здесь] (http://stackoverflow.com/questions/27129986/how-do-return-the-view-with-an-api-controller#comment42759370_27129986) о вопросе, который вы связали с в части 1. – starsplusplus

+0

@starsplusplus, так как вы возвращаете представление, это не способ «WebApi». WebApi используется для возврата JSON или XML, а не Views. Вы действительно должны использовать контроллер. Если вы используете Ninject и имеете ошибку «Parameterless», * вы используете Ninject wrong *, попробуйте повторить конфигурацию Ninject и проверьте этот ответ, чтобы получить любую помощь: http://stackoverflow.com/questions/12311479/asp -net-mvc-4-ninject-mvc-3-no-parameterless-constructor-defined-for-this-ob –

2

API controller - controller, который обеспечивает ответ RESTful. Вы не можете вернуть из него представление. Вместо этого рассмотрите вопрос о возврате ответа (значения), который заставляет клиента запрашивать действие для перенаправления на другой контроллер (если необходимо передать аргументы), чтобы вернуть представление.

В вашем случае не похоже, что вам нужен API; в этом случае просто попробуйте это (изменить то, что вы унаследовали):

public class AdminController : Controller 
{   
    private IUserRepository _repository; 
    public AdminController(IUserRepository repository) 
    { 
     _repository = repository; 
    } 

    public ActionResult Index() 
    { 
     return View(_repository.Users); 
    } 
} 

Я попытаюсь объяснить, что API должны делать в любом случае. Веб-API должен возвращать только информацию. HTTP-ответ о том, что должно делать действие.

Например, для создания нового клиента API должен иметь метод (украшенный POST) для получения информации из клиентского приложения (может быть что угодно: веб, windows, mobile, windows service и т. Д.). Эта информация должна обрабатываться API (или другими слоями в возможной архитектуре) и возвращать код состояния HTTP, например 200 - OK, если это было нормально или 400 - Bad Request, если произошла ошибка. Поэтому, когда я сказал, что вам следует рассмотреть вопрос о возврате информации, вы можете просто вернуть DTO object, чтобы обеспечить результат.

В обоих типах проектов используются принципы MVC, но они используются в другом контексте. Посмотрите на эти статьи:

Также смотрите на сайте ASP.NET о том, как они работают:

+1

положил некоторые ссылки для него, ему нужно как? не почему? –

+0

Спасибо за то, что я понял, что я пытаюсь сделать. Можете ли вы расширить эту часть в своем ответе? «подумайте о возврате ответа (значения), который заставляет клиента запрашивать действие для перенаправления для другого контроллера (если необходимо передать аргументы), чтобы вернуть представление». – starsplusplus

+0

Посмотрите мои правки .. –

0

Используйте контроллер, чтобы визуализировать ваши обычные виды. Действие ApiController возвращает только данные, которые сериализуются и отправляются клиенту. Но все-таки вы хотите сделать вид из APIcontroller, то может быть другой путь, нажмите на ссылку ниже для справки:

https://aspguy.wordpress.com/2013/09/10/web-api-and-returning-a-razor-view/

+0

Прочитайте вопрос перед ответом, у него проблемы при использовании контроллера. –

+0

Я думаю, что правильно прочитал вопрос, у него проблемы, поэтому он использовал APIController, но теперь он хочет знать, как вернуть вид из APIController. пожалуйста, прочитайте название этого сообщения/вопроса. – Vaibhav

+0

@WangerLeonardi Vaibhav правильно прочитал вопрос! Если вы создаете API, но по какой-либо причине хотите поддерживать вывод HTML, они должны использовать Razor Engine для рендеринга бритвенных файлов (aka View). – Aref

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