ASP.NET Core 中 Controller 與 ControllerBase 的差別
1. ControllerBase 介紹
- 部份程式碼
namespace Microsoft.AspNetCore.Mvc;
/// <summary>
/// A base class for an MVC controller without view support.
/// </summary>
[Controller]
public abstract class ControllerBase
{
private ControllerContext? _controllerContext;
private IModelMetadataProvider? _metadataProvider;
private IModelBinderFactory? _modelBinderFactory;
private IObjectModelValidator? _objectValidator;
private IUrlHelper? _url;
private ProblemDetailsFactory? _problemDetailsFactory;
....
- 是 abstract class
- 非 View 相關的 MVC 核心操作皆定義於此
2. Controller 介紹
- 部份程式碼
namespace Microsoft.AspNetCore.Mvc;
/// <summary>
/// A base class for an MVC controller with view support.
/// </summary>
public abstract class Controller : ControllerBase, IActionFilter, IAsyncActionFilter, IDisposable
{
private ITempDataDictionary? _tempData;
private DynamicViewData? _viewBag;
private ViewDataDictionary? _viewData;
....
- 是 abstract class 且繼承自
ControllerBase
- 比
ControllerBase
多了 View 相關支援
3. 兩者主要差別:
Controller
繼承自ControllerBase
Controller
比ControllerBase
多了 View 相關的支援- View
- PartialView
- ViewComponent
- Json (JsonResult)
Controller
比ControllerBase
多了- TempData
- ViewData
- ViewBag
- 基本上如果是開發WEB API可以考慮使用
ControllerBase
即可,開發MVC則使用Controller
較多頁面上的資源可以使用。
4. 小知識
- 通常在開發
Controller
都會在命名時添加在命名後面添加ControllerNameController
,不添加路由就會出錯,ASP.NET MVC 5 之前只要命名不照規定的Controller
名稱結尾,就會完全找不到控制器。 - 但在ASP.NET MVC 5 之後只要滿足以下其中一項條件就可以不用添加:
- 類別名稱尾碼為
Controller
。 - 類別繼承自名稱尾碼為
Controller
的類別。 - 屬性
Controller
會套用至 類別。
- 類別名稱尾碼為
- 參考:ASP.NET Core MVC 中處理控制器要求