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

本文关键字:视图 问题 返回 控制器 API | 更新日期: 2023-09-27 18:31:50

我正在实现一个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

我确实找到了这个问题,但答案基本上是"你不需要在这里使用 ApiController,只需使用控制器",所以这对我没有帮助。

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

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

1. 我需要使用 API 控制器还是控制器?

有人已经在这里回答了这个问题:ASP.NET MVC中ApiController和Controller之间的区别。

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

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

因此,如果要返回View则需要使用简单的 ol' Controller 。WebApi "方式"就像一个 Web 服务,您可以在其中与另一个服务交换数据(将 JSON 或 XML 返回到该服务,而不是视图)。因此,每当你想要为用户返回网页View)时,你都不使用Web API。

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

2.但是如果我使用控制器,则会出现"无参数构造函数"错误。

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

如果你已经在使用 Ninject 并且仍然收到该错误,那么你在 Ninject 上做错了什么。尝试重复安装和配置步骤,并查看有关使用 Ninject 的无参数错误的一些教程或问题

API controller是提供RESTful响应的controller。不能从中返回视图。与其这样做,不如考虑返回一个响应(值),该响应(值)强制请求操作的客户端重定向到另一个控制器(如有必要,传递参数)以返回视图。

您的情况看起来不需要 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 服务等)获取信息。此信息应由 API(或可能体系结构中的其他层)处理并返回 HTTP 状态代码,例如200 - OK是否正常或400 - Bad Request如果发生错误。因此,当我说您应该考虑返回信息时,您可以只返回一个 DTO 对象来提供结果。

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

  • 网页 API 2.0 教程
  • MVC 和 WEB API 之间的区别

另请查看 ASP.NET 网站了解它们的工作原理:

  • ASP.NET 网页接口
  • ASP.NET MVC

使用控制器呈现普通视图。API 控制器操作仅返回序列化并发送到客户端的数据。但是您仍然想从APIcontroller渲染视图,那么可能还有另一种方法,请单击下面的链接以供参考:

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