尝试使用API​​控制器返回视图时出现问题

时间:2014-11-25 15:00:18

标签: c# asp.net controller

我正在实施REST Web API。我使用Adam Freeman的Pro ASP.NET MVC5中的示例作为起点,但将其调整为Web 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”,这对我没用。

3 个答案:

答案 0 :(得分:13)

你有两个不同的问题。让我们分别解决它们。

<强> 1。我需要使用ApiController或Controller吗?:

有人已在此处回答:Difference between ApiController and Controller in ASP.NET MVC

  

您将注意到的第一个主要差异是Web API上的操作   控制器不返回视图,它们返回数据。

     

ApiControllers专门用于返回数据。例如,他们   注意将数据透明地序列化为格式   客户要求。

因此,如果您想要返回View,则需要使用简单的“Controller”。 WebApi“方式”就像是一个Web服务,您可以将数据与另一个服务交换(将JSON或XML返回给该服务,不是View )。因此,只要您想为用户返回网页View),就不要使用Web API。

换句话说,Web API是关于将数据返回到另一个服务(返回JSON或XML),而不是返回给用户。

<强> 2。但是,如果我使用Controller,那么我会得到“无参数构造函数”错误。

好的,现在我们已经遇到了你真正的问题。不要试图重新发明轮子并与ASP.NET争论依赖注入!已存在一个工具来解决依赖注入并排除“无参数构造函数”错误:Ninject

如果您已经在使用Ninject但仍然遇到错误,那么您在使用Ninject时遇到了问题。尝试重复安装和配置步骤,并查看some tutorialsquestions about parameterless error with Ninject use

答案 1 :(得分:2)

API controllercontroller,提供RESTful响应。您无法从中返回视图。不要这样做,考虑返回一个响应(值),强制客户端要求操作重定向到另一个控制器(必要时传递参数)以返回视图。

您的案例看起来不像您需要API;在这种情况下,只需尝试此操作(更改您继承的内容):

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

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

我将尝试解释API应该做什么。 Web API应该只返回信息。关于操作应该执行的操作的HTTP响应。

例如,要创建新客户,API应该有一个方法(用POST修饰)以从客户端应用程序获取信息(可以是任何东西:web,windows,mobile,windows service等)。此信息应由API(或可能的体系结构中的其他层)处理并返回HTTP状态代码,例如200 - OK如果可以正常,或400 - Bad Request如果发生错误。所以,当我说你应该考虑返回信息时,你可以返回DTO object来提供结果。

两种类型的项目都使用MVC原则,但它们在不同的上下文中使用。看看这些文章:

另请参阅ASP.NET网站,了解它们的工作原理:

答案 2 :(得分:0)

使用Controller渲染普通视图。 ApiController操作仅返回序列化并发送到客户端的数据。 但是你仍然希望从APIcontroller渲染视图,那么可能还有另一种方式,点击下面的链接以供参考:

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