URL 經路由解析後,如何找到 Controller、建立實例、呼叫 Action、處理 ActionResult、最終渲染 View?本文深入剖析 ControllerBuilder、ControllerFactory、ActionInvoker、ActionResult 執行管線,並列舉所有內建 ActionResult 類型與自訂開發模式。
RouteData.Values["controller"], ["action"]。DefaultControllerFactory 依命名慣例 ({ControllerName}Controller) 尋找類別,透過 DI 容器或 Activator.CreateInstance 建立實例。Controller 實作 IController,啟動 Action 執行流程。ActionMethodSelector) 找出匹配方法。ModelBinder) 將請求資料映射到參數。AuthorizationFilter) 檢查權限。ActionFilter) OnActionExecuting。ActionResult。ResultFilter) OnResultExecuting。OnResultExecuted、動作過濾器 OnActionExecuted。// 標準 Action
public ActionResult Index() { return View(); }
// 非同步 Action (MVC 4+ / .NET 4.5+)
public async Task IndexAsync() { ... }
// 參數繫結:簡單型別自動從 QueryString/Form/RouteData 取值
public ActionResult Search(string q, int page = 1, int size = 20) { ... }
// 複雜型別:模型繫結器自動映射
public ActionResult Create(ProductViewModel model) { ... }
| 類型 | 用途 | 典型用法 |
|---|---|---|
ViewResult | 渲染視圖 | return View(model); / return View("CustomView", model); |
PartialViewResult | 渲染部分視圖 | return PartialView("_Widget", model); |
RedirectResult | 重導向絕對/相對 URL | return Redirect("~/Home/Index"); / return Redirect("https://example.com"); |
RedirectToRouteResult | 重導向至路由 | return RedirectToAction("Index"); / return RedirectToRoute("Default", new { controller="Home", action="Index" }); |
JsonResult | 回傳 JSON (AJAX) | return Json(data, JsonRequestBehavior.AllowGet); |
ContentResult | 回傳純文字/HTML/XML | return Content("Hello", "text/plain", Encoding.UTF8); |
FileResult | 回傳檔案下載/內嵌 | return File(bytes, "application/pdf", "report.pdf"); / return File(path, "image/jpeg"); |
JavaScriptResult | 回傳 JS 供瀏覽器執行 | return JavaScript("$('#div').hide();"); |
HttpStatusCodeResult | 自訂狀態碼 | return new HttpStatusCodeResult(404, "Not Found"); |
EmptyResult | 無內容回應 (AJAX 回調用) | return new EmptyResult(); |
public class CsvResult : ActionResult
{
private readonly IEnumerable
Controller/Action 是 MVC **「請求進入、業務協調、回應輸出」** 的核心樞紐。理解 ActionInvoker 管線 (選擇→繫結→授權→執行→結果執行)、ActionResult 多型分派、模型繫結與過濾器插入點,能讓你在**攔截驗證、統一錯誤處理、自訂結果格式、非同步流程控制**等進階需求上遊刃有餘。記住:Action 方法應**薄而專注**,核心業務邏輯屬於 Service/Domain 層。