繁体   English   中英

为什么从 ASP.NET Core Web API 的 ControllerBase 与 Controller 派生?

[英]Why derive from ControllerBase vs Controller for ASP.NET Core Web API?

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

TodoController : Controller

然后在我应该使用的教程代码中,我发现:

[Route("api/[controller]")]
[ApiController]
TodoController : ControllerBase

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

为什么需要从ControllerBase派生而不是 Web API 控制器的Controller

这不是绝对必要的,只是更重要的一点。 Controller类派生自ControllerBase并添加了一些只需要支持 View 的成员。

基本上:

public abstract class Controller : ControllerBase
{
    public dynamic ViewBag { get; }
    public virtual ViewResult View(object model) { }
    // more View support stuff
}

当您编写 API 时,ControllerBase 会更好地满足您的要求,但两者都可以工作。

文档(强调我的):

不要通过从 Controller 类派生来创建 Web API 控制器。 Controller 派生自 ControllerBase 并添加了对视图的支持,因此它用于处理网页,而不是 Web API 请求。 此规则有一个例外:如果您计划对视图和 Web API 使用相同的控制器,请从 Controller 派生它

我似乎记得在第一次 MVC 迭代中没有 ControllerBase,它是后来插入的。 因此有点奇怪的命名/继承结构。

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

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

另一个重要区别是 ControllerBase 是抽象类,这就是它不实现 Dispose 方法的原因。 所以你需要自己处理。 看到这个SO 条目

ControllerBase 抽象类

Controller 抽象类派生自 ControllerBase 抽象类,因此支持创建视图,API 不建议创建视图。

ControllerBase 抽象类有 Member[Properties,Methods] 没有 Implementaion Like

public abstract class ControllerBase{
        public HttpResponse Response { get; }
        public HttpRequest Request { get; }
        public HttpContext HttpContext { get; }
        public virtual RedirectToActionResult RedirectToAction(string actionName);}

ControllerBase 拥有 Client-side 和 Server-side 之间的所有 Request 和 Response


控制器抽象类

控制器抽象类使我们能够创建视图以在客户端显示数据,它派生自 ControllerBase 抽象类。

public abstract class Controller : ControllerBase{
        public dynamic ViewBag { get; }
        
        public ViewDataDictionary ViewData { get; set; }
       
        public ITempDataDictionary TempData { get; set; }
}

https://newbedev.com/why-derive-from-controllerbase-vs-controller-for-asp-net-core-web-api

控制器抽象类支持视图 && ControllerBase 抽象类不支持创建视图

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM