为什么从ControllerBase vs Controller for ASP.NET Core Web API派生?

Pro*_*ofK 8 c# asp.net asp.net-web-api asp.net-core

我正在按照本教程创建ASP.NET Core Web API,并且在添加控制器的部分中,该教程提供了用于替换控制器模板代码的代码。真正引起我注意的一件事是,在模板代码中,我得到了:

TodoController : Controller
Run Code Online (Sandbox Code Playgroud)

然后,在本教程代码中,我应该使用它代替:

[Route("api/[controller]")]
[ApiController]
TodoController : ControllerBase
Run Code Online (Sandbox Code Playgroud)

我非常想知道为什么需要从Web API控制器ControllerBase而不是ControllerWeb API控制器中派生。为什么要这样做?

小智 15

来自https://docs.microsoft.com/en-us/aspnet/core/web-api/?view=aspnetcore-3.1

不要通过从 Controller 类派生来创建 Web API 控制器。Controller 派生自 ControllerBase 并添加了对视图的支持,因此它用于处理网页,而不是 Web API 请求。

  • 除非您对 API 请求和视图使用相同的控制器。来自您的链接:“此规则有一个例外:如果您计划对视图和 Web API 使用相同的控制器,请从 Controller 派生它。” (4认同)

Hen*_*man 11

为什么必须从Web API控制器ControllerBase而不是ControllerWeb API控制器中派生。

并非绝对必要,仅此而已。将Controller类从派生ControllerBase并只添加了一些需要支持浏览几个成员。

基本上:

public class Controller : ControllerBase
{
    public dynamic ViewBag { get; }
    public virtual ViewResult View(object model) { }
    // more
}
Run Code Online (Sandbox Code Playgroud)

编写API时,ControllerBase可以更好地满足您的要求,但两者都可以使用。

  • 正如 ControllerBase 类的摘要所述:ControllerBase - “没有视图支持的 MVC 控制器的基类。” (12认同)