尝试使用 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,只需使用控制器",所以这对我没有帮助。
你有两个不同的问题。让我们分别解决它们。
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/