ASP.NET Core 中 Controller 與 ControllerBase 的差別

  • 1472
  • 0

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. 兩者主要差別:

  1. Controller繼承自ControllerBase
  2. ControllerControllerBase多了 View 相關的支援
    1. View
    2. PartialView
    3. ViewComponent
    4. Json (JsonResult)
  3. ControllerControllerBase多了
    1. TempData
    2. ViewData
    3. ViewBag
  4. 基本上如果是開發WEB API可以考慮使用ControllerBase即可,開發MVC則使用Controller較多頁面上的資源可以使用。

4. 小知識

  1. 通常在開發Controller都會在命名時添加在命名後面添加ControllerNameController,不添加路由就會出錯,ASP.NET MVC 5 之前只要命名不照規定的Controller名稱結尾,就會完全找不到控制器。
  2. 但在ASP.NET MVC 5 之後只要滿足以下其中一項條件就可以不用添加:
    1. 類別名稱尾碼為Controller
    2. 類別繼承自名稱尾碼為Controller的類別。
    3. 屬性Controller會套用至 類別。
  3. 參考:ASP.NET Core MVC 中處理控制器要求