asp.net NET核心Web API为何从ControllerBase派生而不是从Controller派生?

eivgtgni  于 2023-03-04  发布在  .NET
关注(0)|答案(5)|浏览(308)

我正在学习这个创建ASP.NET Core Web API的教程,在添加控制器的部分,教程给出了替换控制器模板代码的代码。真正吸引我眼球的是,在模板代码中,我得到了:

TodoController : Controller

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

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

我很想知道为什么Web API控制器必须从ControllerBase而不是Controller派生。

zte4gxcn

zte4gxcn1#

为什么Web API控制器必须从ControllerBase而不是Controller派生。
这并不是绝对必要的,Controller类派生自ControllerBase,并添加了一些仅支持视图所需的成员。
基本上:

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

当您编写API时,ControllerBase会更好地满足您的需求,但两者都可以工作。
the documentation(强调我的):
不要通过从Controller类派生来创建Web API控制器。Controller派生自ControllerBase并添加了对视图的支持,因此它用于处理网页,而不是Web API请求。此规则有一个例外:* * 如果您计划对视图和Web API使用相同的控制器,请从Controller**派生它。
我似乎记得在第一次MVC迭代中没有ControllerBase,它是后来插入的,因此命名/继承结构有点奇怪。

6kkfgxo0

6kkfgxo02#

https://learn.microsoft.com/en-us/aspnet/core/web-api/?view=aspnetcore-3.1
不要通过从Controller类派生来创建web API控制器。Controller派生自ControllerBase并添加了对视图的支持,因此它是用于处理网页的,而不是web API请求。

8gsdolmq

8gsdolmq3#

ControllerBase抽象类

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

  • ControllerBase抽象类具有没有类似实现的成员[属性,方法]*
public abstract class ControllerBase{
        public HttpResponse Response { get; }
        public HttpRequest Request { get; }
        public HttpContext HttpContext { get; }
        public virtual RedirectToActionResult RedirectToAction(string actionName);}

ControllerBase具有客户端和服务器端之间的所有请求和响应

控制器抽象类

Controller抽象类使我们能够创建视图以在客户端显示数据,它派生自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

kxkpmulp

kxkpmulp4#

另一个重要的区别是ControllerBase是抽象类,这就是为什么它没有实现Dispose方法。所以你需要自己处理。参见SO entry

r1zk6ea1

r1zk6ea15#

当你把一个控制器改变为一个控制器基时,下面的索引方法抛出一个错误“编译器错误CS0103”,名称'identifier'在当前上下文中不存在,

public IActionResult Index()
    {
    return View();
    }

相关问题