Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 尝试使用API控制器返回视图时出现问题_C#_Asp.net_Controller - Fatal编程技术网

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

C# 尝试使用API控制器返回视图时出现问题,c#,asp.net,controller,C#,Asp.net,Controller,我正在实现一个RESTWebAPI。我使用Adam Freeman的Pro ASP.NET MVC5中的示例作为起点,但将其调整为Web API方式 以下是我的代码: public class AdminController : ApiController { private IUserRepository _repository; public AdminController(IUserRepository repository) {

我正在实现一个RESTWebAPI。我使用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
,但现在它无法识别
视图

对于
ApiController
,我需要使用什么来代替
View


我确实找到了答案,但答案基本上是“你不需要在这里使用ApiController,只需要使用Controller”,所以这对我没有帮助。一个
API控制器是一个
控制器,它提供了一个RESTful响应。无法从中返回视图。而不是这样做,考虑返回一个响应(值),它迫使客户端请求一个动作重定向到另一个控制器(如果需要传递参数)返回一个视图。
您的案例看起来不需要API;在这种情况下,只需尝试以下方法(更改您继承的内容):

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

例如,要创建新客户,API应该有一个方法(用POST修饰)来从客户机应用程序(可以是任何内容:web、windows、mobile、windows服务等)获取信息。此信息应由API(或可能的体系结构中的其他层)处理,并返回HTTP状态代码,例如,如果正常,则返回
200-OK
;如果发生错误,则返回
400-Bad Request
。所以,当我说你应该考虑返回信息时,你可以只返回A来提供结果。 这两种类型的项目都使用MVC原则,但它们在不同的环境中使用。请看这些文章:

还可以查看ASP.NET网站,了解它们的工作原理:


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


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

1。我需要使用ApiController还是Controller?:

这里已经有人回答了这个问题:

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

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

因此,如果要返回
视图
,则需要使用简单的ol'
控制器
。WebApi“方式”类似于一个Web服务,您可以在其中与另一个服务交换数据(向该服务返回JSON或XML,而不是视图)。因此,无论何时您想要为用户返回网页(
查看
),您都不会使用Web API

换句话说,WebAPI是将数据返回给另一个服务(返回JSON或XML),而不是用户

2。但如果使用控制器,则会出现“无参数构造函数”错误。

好了,现在我们来谈谈你真正的问题。不要试图重新发明轮子,并与ASP.NET就依赖项注入进行斗争!已存在用于解决依赖项注入和排序“无参数构造函数”错误的工具:


如果您已经在使用Ninject,但仍然会出现错误,则说明您在使用Ninject时出错。尝试重复安装和配置步骤,然后查看或

您不从API控制器返回视图。但是您可以从MVC控制器返回API数据。解决方案是纠正错误,而不是尝试破解API控制器。构造函数参数当然可以在控制器中用于依赖项注入。也许您没有正确连接依赖项解析程序?顺便说一句,您可以插入
ApiController
Controller
——但是您需要
Controller
@DavidTansey这是X/Y问题吗?我应该问一个关于如何修正无参数构造函数错误的新问题吗?给他一些参考资料,他需要怎么做?不是为什么?谢谢你抓住了我想做的核心。你能在回答中详细说明这一部分吗?“考虑返回一个响应(值),使请求操作的客户端重定向到另一个控制器(如有必要,传递参数)以返回视图。”对于POST请求,您可能希望返回
201 Created
,而不是
200 OK
,我想?除此之外,这是伟大的。谢谢你的解释+1.是的,可以在服务器端创建资源时创建
201-
。但是帖子可能会返回
200-好的
在回答之前阅读问题,他在使用控制器时遇到问题。我想我读对了问题,他遇到了问题,所以他使用了APIController,但现在他想知道如何从APIController返回视图。请阅读此帖子/问题的标题。@WangerLeonardi Vaibhav正确阅读了问题!如果一个人创建了一个API,但出于任何原因想要支持HTML输出,他们必须使用Razor引擎来呈现Razor文件(也称为视图)。另外,请参阅我在第1部分中对您链接到的问题的查询。@starsplusplus,因为您返回的是一个视图,所以不是“WebApi”方式。WebApi用于返回JSON或XML,而不是视图。你真的应该使用控制器。如果您使用的是Ninject并具有“无参数”
public class AdminController : Controller
{        
    private IUserRepository _repository;
    public AdminController(IUserRepository repository) 
    {
        _repository = repository; 
    }

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