Controller 激活系統是 MVC 請求處理的起點。本文梳理核心介面與類別架構:IController/IAsyncController、ControllerBase、ControllerContext、Controller 類別繼承體系,為理解激活流程奠基。
public interface IController
{
void Execute(RequestContext requestContext);
}
public interface IAsyncController : IController
{
IAsyncResult BeginExecute(RequestContext requestContext, AsyncCallback callback, object state);
void EndExecute(IAsyncResult asyncResult);
}
同步/異步雙介面支援,MVC 運行時自動偵測實作介面選擇執行方式。
public abstract class ControllerBase : IController
{
public ControllerContext ControllerContext { get; set; }
public TempDataDictionary TempData { get; set; }
public object ViewBag { get; } // 動態物件,包裝 ViewData
public ViewDataDictionary ViewData { get; set; } // 字典式資料傳遞
}
TempData:跨請求暫存(預設 Session 儲存),Keep() 可保留。ViewBag 為 ViewData 動態包裝,屬性存取轉為字典鍵值操作。
public class ControllerContext
{
public ControllerBase Controller { get; set; }
public RequestContext RequestContext { get; set; }
public HttpContextBase HttpContext { get; set; }
public RouteData RouteData { get; set; }
// 建構子支援 (RequestContext, Controller) 或 (HttpContext, RouteData, Controller)
}
封裝 Controller 與 RequestContext(含 HttpContext + RouteData),所有屬性可讀寫,便於測試與攔截修改。
public abstract class Controller :
ControllerBase,
IController,
IAsyncController,
IActionFilter,
IAuthorizationFilter,
IExceptionFilter,
IResultFilter,
IDisposable
{
// 大量輔助方法:View(), Redirect(), Json(), File(), PartialView()...
// ViewData/ModelState/TempData/RouteData/Url/Html/HttpContext 等便利屬性
}
Controller 同時實作四大過濾器介面,使 Controller 本身可作為全域/區域過濾器參與管線。ExecuteCore 為核心執行邏輯入口,子類別可覆寫擴展。