咨询区
Alex Sanséau:
我是 ASP.NET Core Web API 的初学者,我在跟着文档创建 Controller 时,VS模板引擎给我生成了如下 Controller 模板代码,我发现有一个奇怪的地方如下:
public class TodoController : Controller
{
}
但文档中给出的Controller模板是下面这样的。
[Route("api/[controller]")]
[ApiController]
public class TodoController : ControllerBase
{
}
对,就是 Controller 和 ControllerBase 的问题,我真的很想知道为啥要用 ControllerBase 而不是 Controller 呢?
回答区
Henk Holterman:
其实两者并没有严格区别,如果往细处说,Controller 是继承于 ControllerBase 的,同时子类添加了一些为 MVC 中的 Views 设计的一些属性和方法,参考如下代码:
public abstract class Controller : ControllerBase
{
//
// Summary:
// Gets the dynamic view bag.
public dynamic ViewBag { get; }
public ViewDataDictionary ViewData { get; set; }
//
// Summary:
// Gets or sets Microsoft.AspNetCore.Mvc.ViewFeatures.ITempDataDictionary used by
// Microsoft.AspNetCore.Mvc.ViewResult.
public ITempDataDictionary TempData { get; set; }
}
如果你写的是 API 程序,那自然 ControllerBase 更适合需求,虽然两者都可以用。
我记得第一版MVC并没有 ControllerBase,它是后来添加的,所以这取名看起来怪怪的。
Mark:
可以看下官方文档:https://docs.microsoft.com/en-us/aspnet/core/web-api/?view=aspnetcore-3.1
你应该就明白,当你想创建MVC项目时可使用 Controller 父类,如果是WebAPI项目可使用 ControllerBase 类。
另一个不同点在于,ControllerBase 是一个抽象类,所以它没有方法实现,自然也就没有Dispose方法了,这里要注意一下。
点评区
两位大佬说的很清楚了,学习了。