我正在实施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”,这对我没用。
答案 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 tutorials或questions about parameterless error with Ninject use
答案 1 :(得分: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应该做什么。 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/