![](/img/trans.png)
[英]asp.net core ControllerBase.User without implementing 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 条目
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.