許多開發者混淆 **MVC 模式** 與 **三層架構 (3-Tier/N-Tier)**。兩者解決不同層面問題:MVC 是 **UI 層內部的關注點分離**,三層架構是 **系統層級的邏輯分層**。ASP.NET MVC Framework 旨在解決 Web Forms 的狀態管理複雜、測試困難、前後端耦合嚴重等痛點。
| 維度 | 三層架構 (3-Tier) | MVC 模式 |
|---|---|---|
| 範疇 | 整個應用系統 | UI 呈現層內部 |
| 分層 | Presentation / Business Logic / Data Access | Model / View / Controller |
| Model 內容 | 不包含 (屬於 DAL/BLL) | **包含** BLL + DAL + 領域模型 + ViewModel |
| View 職責 | .aspx + Code-behind 混雜邏輯 | **純粹輸出 HTML**,無 Code-behind、無 runat="server" |
| Controller 職責 | 分散在 Code-behind 事件中 | **集中處理** 流程控制、驗證、授權、模型繫結 |
| 耦合度 | View 強依賴 Code-behind | **鬆散耦合**,View 不依賴 Controller,Model 不依賴 View/Controller |
| 測試性 | 難以單元測試 UI 邏輯 | **高度可測試** (Controller 為純類別,可 Mock Model/View) |
MyApp/ ├── Controllers/ # Controller 類別 (每個 .cs 一個 Controller) │ ├── HomeController.cs │ └── ProductController.cs ├── Models/ # 領域模型、ViewModel、資料存取介面 │ ├── Domain/ │ ├── ViewModels/ │ └── Repositories/ ├── Views/ # Razor 視圖 (.cshtml) │ ├── Home/ │ │ ├── Index.cshtml │ │ └── About.cshtml │ ├── Product/ │ └── Shared/ # Layout、Partial Views ├── Scripts/ # JavaScript (jQuery, Bootstrap, 自訂) ├── Content/ # CSS、圖片、字型 ├── App_Start/ # 路由、Bundle、Filter 配置 │ ├── RouteConfig.cs │ └── BundleConfig.cs ├── Global.asax.cs # 應用程式啟動事件 └── Web.config
| Web Forms 習慣 | MVC 實踐 |
|---|---|
| 邏輯寫在 .aspx.cs Code-behind 事件 | 邏輯寫在 Controller Action 方法 |
| 使用 ViewState 保持狀態 | **無 ViewState**,靜態 HTTP,狀態在 Model/Session/Client |
| Server Controls (runat="server") 產生 HTML | **手寫 HTML + Razor 語法**,完全掌控輸出 |
| Postback 事件驅動 | **RESTful 風格**:GET 顯示、POST 建立、PUT 更新、DELETE 刪除 |
| Page_Load 判斷 IsPostBack | Action 方法天然分離 (Index/Create/Edit/Delete) |
| UpdatePanel 部分更新 | AJAX 回傳 JSON/PartialView,前端 Vue/React/jQuery 渲染 |
ASP.NET Core 重寫了整個管線,核心概念 (MVC、Middleware、DI、Configuration) 保留但實作全新:
新專務請直接使用 ASP.NET Core MVC**,舊專案評估遷移成本後再決定。