【问题标题】:Problems trying to return the view with an API controller尝试使用 API 控制器返回视图时出现问题
【发布时间】:2023-03-23 19:31:02
【问题描述】:

我正在实现一个 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”所以这对我没有帮助。

【问题讨论】:

标签: c# asp.net controller


【解决方案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 tutorialsquestions about parameterless error with Ninject use

【讨论】:

  • 另外,请参阅我的查询 here 关于您在第 1 部分中链接到的问题。
  • @starsplusplus,因为您要返回一个视图,所以它不是“WebApi”方式。 WebApi 用于返回 JSON 或 XML,而不是视图。你真的应该使用控制器。如果您使用 Ninject 并且出现“无参数”错误,您使用 Ninject 错误,请尝试重复 Ninject 配置,并检查此答案以获得任何帮助:stackoverflow.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 原则,但它们用于不同的上下文。看看这些文章:

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

【讨论】:

  • 给他一些参考资料,他需要怎么做?不是为什么?
  • 感谢您深入了解我正在尝试做的事情。您可以在答案中扩展这部分吗? “考虑返回一个响应(值),使请求操作的客户端重定向另一个控制器(必要时传递参数)以返回视图。”
  • 对于 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 文件(又名视图)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多