MVC (Model-View-Controller) 是一種**軟件架構模式**,將應用劃分為三大核心組件:
Java (Spring MVC, Struts2)、Python (Django, Flask)、PHP (Laravel)、Go (Gin)、Node (Express) 均實現 MVC 模式。ASP.NET MVC 是微軟在 .NET 平台上的實現,**開源** (GitHub: aspnet/AspNetCore),從 2008 年 1.0 版本發展至今 (ASP.NET Core 8.0+)。
Controller → 操作 Model → 選擇 View → 渲染響應
↑ ↓
└──────── 用戶交互 (表單提交/鏈接點擊) ────────┘
| 特性 | WebForms | MVC |
|---|---|---|
| 編程模型 | 事件驅動 (Page_Load, Button_Click) | 請求-響應 (Action 執行) |
| URL 映射 | 基於物理文件 (.aspx) | 基於路由規則 (/Controller/Action/id) |
| 狀態管理 | ViewState (隱藏字段,體積大) | 無狀態 (RESTful 友好) |
| HTML 控制 | 服務端控件生成 (難控制) | 完全掌控 HTML (前端友好) |
| 測試性 | 難單元測試 (依賴 HttpContext) | 易測試 (Controller 純類,可 Mock) |
| 關注點分離 | 代碼隱藏 .aspx.cs 混合邏輯 | Model/View/Controller 物理分離 |
兩者**共享 ASP.NET 運行時** (Pipeline, Module, Handler, Session, Cache 等),可在同一應用中混合使用 (舊模塊 WebForms、新模塊 MVC)。
| 約定 | 規則 | 目的 |
|---|---|---|
| 控制器位置 | /Controllers 資料夾 | 統一管理 |
| 控制器命名 | 類名以 Controller 結尾 (如 HomeController) | 路由默認查找 |
| 視圖位置 | /Views/{ControllerName}/{ActionName}.cshtml | 自動查找視圖 |
| 共享視圖 | /Views/Shared/ | Layout、Partial 跨控制器復用 |
| 模型位置 | /Models/ 或獨立類庫 | 業務邏輯集中 |
| 基類 | Controller 繼承 System.Web.Mvc.Controller | 提供輔助方法 (View, Json, Redirect...) |
URL 解析示例
| 請求 URL | 匹配 Controller | 匹配 Action | 參數 id | 說明 |
|---|---|---|---|---|
| / | Home | Index | null | 全匹配默認值 |
| /Home | Home | Index | null | Action 使用默認 |
| /Home/About | Home | About | null | 標準匹配 |
| /Product/Detail/123 | Product | Detail | 123 (string) | id 映射到 Action 參數 |
| /Product/Detail/123?name=abc | Product | Detail | 123 | 查詢字符串自動綁定到其他參數 |
Action 參數名 **不區分大小寫** 匹配:
視圖中的 Model 與類型聲明
Razor 視圖 (.cshtml)
ASPX 視圖 (.aspx) - 老版本
<%@ Import Namespace="MyProject.Models" %><%= Model.Name %>
請求處理流程圖解
1. 用戶輸入 URL → 瀏覽器發送 HTTP Request 2. IIS/ASP.NET Core Middleware Pipeline 3. UrlRoutingModule 攔截 → 匹配 RouteCollection 4. MvcRouteHandler → MvcHandler 5. ControllerFactory 創建 Controller 實例 6. ActionInvoker ├─ 選擇 Action 方法 (ActionNameSelector, ActionMethodSelector) ├─ 模型綁定 (DefaultModelBinder) → Action 參數 ├─ 執行過濾器 (Authorization → Action → Result → Exception) └─ 執行 Action 返回 ActionResult 7. ActionResult 執行結果 ├─ ViewResult → ViewEngine 查找 .cshtml → RazorView 渲染 → HTML ├─ JsonResult → JsonSerializer 序列化 → JSON ├─ RedirectResult → 302 Location Header └─ FileResult → 二進制流 + Content-Disposition 8. HTTP Response 返回瀏覽器新手常見誤區
| 誤區 | 正確理解 |
|---|---|
| 以為必須用 Entity Framework | Model 可以是任何類:ADO.NET、Dapper、Web API 調用、內存對象 |
| 在 View 中寫業務邏輯/數據庫查詢 | View 僅渲染,所有邏輯在 Controller/Service |
| Controller 過於臃腫 (Fat Controller) | 引入 Service Layer,Controller 僅負責 HTTP 協議轉換 |
| 忽略 ModelState.IsValid | 服務端驗證是安全底線,必須檢查 |
| 以為路由只能有一條 | 可註冊多條路由,按順序匹配,支援屬性路由 [Route("api/users/{id}")] |
ASP.NET MVC 以**約定大於配置**降低認知負荷,通過**路由系統**實現 RESTful URL,通過**模型綁定**自動映射請求數據,通過**ActionResult 多態**支撐多樣化響應。理解其請求流程、組件職責邊界、約定規則,是掌握該框架的基石。新項目請直接拥抱 ASP.NET Core,享受現代 .NET 生態紅利。