首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> ASP.NET 基礎 >> 關於ASP.NET

ASP.NET MVC 學習筆記 (三) Controller/Action 深度解析:從路由到視圖的完整鏈路

     編輯:關於ASP.NET

URL 經路由解析後,如何找到 Controller、建立實例、呼叫 Action、處理 ActionResult、最終渲染 View?本文深入剖析 ControllerBuilder、ControllerFactory、ActionInvoker、ActionResult 執行管線,並列舉所有內建 ActionResult 類型與自訂開發模式。

Controller 建立與執行管線

  1. 路由匹配:RouteData.Values["controller"], ["action"]。
  2. ControllerFactory.CreateController:預設 DefaultControllerFactory 依命名慣例 ({ControllerName}Controller) 尋找類別,透過 DI 容器或 Activator.CreateInstance 建立實例。
  3. Controller.Execute(RequestContext):基類 Controller 實作 IController,啟動 Action 執行流程。
  4. ActionInvoker.InvokeAction:核心協調器,負責:
    • 動作選擇器 (ActionMethodSelector) 找出匹配方法。
    • 模型繫結器 (ModelBinder) 將請求資料映射到參數。
    • 授權過濾器 (AuthorizationFilter) 檢查權限。
    • 動作過濾器 (ActionFilter) OnActionExecuting。
    • **呼叫 Action 方法** → 取得 ActionResult。
    • 結果過濾器 (ResultFilter) OnResultExecuting。
    • ActionResult.ExecuteResult(ControllerContext):執行結果 (渲染視圖、重導、JSON、檔案...)。
    • 結果過濾器 OnResultExecuted、動作過濾器 OnActionExecuted。

Action 方法簽章與回傳類型

// 標準 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) { ... }

所有內建 ActionResult 類型速查表

類型用途典型用法
ViewResult渲染視圖return View(model); / return View("CustomView", model);
PartialViewResult渲染部分視圖return PartialView("_Widget", model);
RedirectResult重導向絕對/相對 URLreturn 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/XMLreturn 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();

自訂 ActionResult 開發模式

public class CsvResult : ActionResult
{
    private readonly IEnumerable _data;
    private readonly string _fileName;

    public CsvResult(IEnumerable data, string fileName)
    {
        _data = data;
        _fileName = fileName;
    }

    public override void ExecuteResult(ControllerContext context)
    {
        var response = context.HttpContext.Response;
        response.ContentType = "text/csv";
        response.AddHeader("Content-Disposition", $"attachment; filename={_fileName}.csv");
        response.ContentEncoding = Encoding.UTF8;

        // 簡易 CSV 生成 (實際建議用 CsvHelper 套件)
        var sb = new StringBuilder();
        if (_data.Any())
        {
            var props = _data.First().GetType().GetProperties();
            sb.AppendLine(string.Join(",", props.Select(p => p.Name)));
            foreach (var item in _data)
            {
                sb.AppendLine(string.Join(",", props.Select(p => p.GetValue(item)?.ToString()?.Replace(",", ",") ?? "")));
            }
        }
        response.Write(sb.ToString());
    }
}

// Controller 使用
public ActionResult ExportCsv()
{
    var data = _repo.GetAll();
    return new CsvResult(data, "Products_Export");
}

結語

Controller/Action 是 MVC **「請求進入、業務協調、回應輸出」** 的核心樞紐。理解 ActionInvoker 管線 (選擇→繫結→授權→執行→結果執行)、ActionResult 多型分派、模型繫結與過濾器插入點,能讓你在**攔截驗證、統一錯誤處理、自訂結果格式、非同步流程控制**等進階需求上遊刃有餘。記住:Action 方法應**薄而專注**,核心業務邏輯屬於 Service/Domain 層。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved