尝试使用 API 控制器返回视图时出现问题
Posted
技术标签:
【中文标题】尝试使用 API 控制器返回视图时出现问题【英文标题】:Problems trying to return the view with an API controller 【发布时间】:2015-01-23 15:35:36 【问题描述】:我正在实现一个 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
。
对于ApiController
,我需要使用什么来代替View
?
我确实找到了this question,但答案基本上是“你不需要在这里使用 ApiController,只需使用 Controller”所以这对我没有帮助。
【问题讨论】:
Difference between ApiController and Controller in ASP.NET MVC 您不会从 API 控制器返回视图。但是您可以从 MVC 控制器返回 API 数据。解决方案是纠正错误,而不是尝试破解 API 控制器。构造函数参数当然可以在控制器中用于依赖注入。也许您没有正确连接依赖解析器? 顺便说一句,你可以注入ApiController
和 Controller
-- 但你想要 Controller
asp.net/web-api/overview/getting-started-with-aspnet-web-api/…
@DavidTansey 这是 X/Y 问题吗?我应该问一个关于如何修复无参数构造函数错误的新问题吗?
【参考方案1】:
您有两个不同的问题。让我们分别解决。
1.我需要使用 ApiController 还是 Controller?:
这里已经有人回答了这个问题:Difference between ApiController and Controller in ASP.NET MVC。
您会注意到的第一个主要区别是 Web API 上的操作 控制器不返回视图,它们返回数据。
ApiController 专门用于返回数据。例如,他们 负责透明地将数据序列化为格式 客户要求。
因此,如果您想返回 View
,您需要使用简单的 ol' Controller
。 WebApi“方式”就像一个网络服务,您可以在其中与另一个服务交换数据(向该服务返回 JSON 或 XML,不是视图)。因此,当您想为不使用 Web API 的用户返回 网页 (View
) 时。
换句话说,Web API 是关于将数据返回给另一个服务(返回 JSON 或 XML),而不是返回给用户。
2。但是,如果我使用 Controller,则会出现“无参数构造函数”错误。
好的,现在我们解决了您真正的问题。不要试图重新发明***并与 ASP.NET 争论进行依赖注入!已经存在解决依赖注入并解决“无参数构造函数”错误的工具:Ninject。
如果您已经在使用 Ninject 并且仍然出现该错误,那么您在使用 Ninject 时做错了。尝试重复安装和配置步骤,看some tutorials或questions about parameterless error with Ninject use
【讨论】:
另外,请参阅我的查询 here 关于您在第 1 部分中链接到的问题。 @starsplusplus,因为您要返回一个视图,所以它不是“WebApi”方式。 WebApi 用于返回 JSON 或 XML,而不是视图。你真的应该使用控制器。如果您使用 Ninject 并且出现“无参数”错误,您使用 Ninject 错误,请尝试重复 Ninject 配置,并检查此答案以获得任何帮助:***.com/questions/12311479/… 因为你要返回一个视图,它不是“WebApi”的方式。 WebApi 用于返回 JSON 或 XML,而不是 Views。 对,但我的问题是如何以 Web API 的方式进行? 我想用WebApi的方式解决同样的问题,而不是找对等的语法。 别担心,它不会变成变色龙问题 :) 如果我有一个新问题并且其他问题的答案没有解决它,我会将它作为一个新问题提出。 【参考方案2】: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、移动设备、Windows 服务等)获取信息。此信息应由 API(或可能的架构中的其他层)处理并返回 HTTP 状态代码,例如 200 - OK
如果没问题,或 400 - Bad Request
如果发生错误。所以,当我说你应该考虑返回信息时,你可以只返回一个DTO object 来提供结果。
这两种类型的项目都使用 MVC 原则,但它们用于不同的上下文。看看这些文章:
Web Api 2.0 Tutorial Difference between MVC and WEB API还可以查看 ASP.NET 网站了解它们的工作原理:
ASP.NET WEB API ASP.NET MVC【讨论】:
给他一些参考资料,他需要怎么做?不是为什么? 感谢您深入了解我正在尝试做的事情。您可以在答案中扩展这部分吗? “考虑返回一个响应(值),使请求操作的客户端重定向另一个控制器(必要时传递参数)以返回视图。” 对于 POST 请求,您可能希望返回201 Created
而不是 200 OK
,我想?除此之外,这很棒。感谢您的解释。 +1。
是的,在服务器端创建资源时可能是201 - Created
。但是 POST 可能会返回 200 - OK
【参考方案3】:
使用 Controller 渲染您的普通视图。 ApiController 操作仅返回序列化并发送到客户端的数据。 但是你还是想从 APIcontroller 渲染视图,那么可能有另一种方式,点击下面的链接供参考:
https://aspguy.wordpress.com/2013/09/10/web-api-and-returning-a-razor-view/
【讨论】:
在回答之前先看问题,他在使用Controller时遇到问题。 我想我读对了这个问题,他遇到了问题,所以他使用了 APIController,但现在他想知道如何从 APIController 返回视图。请阅读这篇文章/问题的标题。 @WangerLeonardi Vaibhav 已正确阅读问题!如果一个人创建了一个 API,但出于某种原因还想支持 html 输出,他们必须使用 Razor 引擎来呈现 razor 文件(又名视图)。以上是关于尝试使用 API 控制器返回视图时出现问题的主要内容,如果未能解决你的问题,请参考以下文章
当我在真实设备中频繁推送/返回视图控制器时出现错误“索引超出范围” - Swift