本文將帶您深入理解 ASP.NET MVC 架構,從模型-視圖-控制器模式切入,探討控制器與視圖建立、表單與回發處理、控制器工廠等擴展點,並分享資深開發者從桌面應用轉型 Web 開發的心路歷程。
作者擁有 25 年開發經驗,早期專注桌面應用。90 年代初接觸 Web 卻因無狀態特性、調試困難、缺乏 UNIX 權限及「尷尬的角括號」而退卻。直到 .NET Framework 與 ASP.NET 面世,才以類桌面編程模型(視窗、控件、事件、設計器、ViewState 自動管理無狀態)重燃 Web 開發熱情。
隨經驗增長,作者將桌面開發的兩大鐵律帶入 Web:
然而,傳統 Web Forms 雖簡化開發,卻將邏輯綁在代碼後置,難以單元測試;ViewState 膨脹影響效能;頁面生命週期複雜,擴展受限。這促使作者擁抱 MVC。
| 層面 | Web Forms | ASP.NET MVC |
|---|---|---|
| 架構模式 | 頁面控制器 | 前端控制器 + MVC |
| 狀態管理 | ViewState (隱藏欄位) | 無狀態,開發者自控 |
| HTML 掌控度 | 控件自動生成,難微調 | 完全掌控標記輸出 |
| 測試性 | 需啟動 IIS/伺服器 | 控制器為純類別,易模擬測試 |
| 擴展點 | 受限於頁面生命週期 | 路由、控制器工廠、模型繫結器等豐富管線 |
控制器處理請求、協調模型、選擇視圖。視圖專注呈現,透過 ViewData、ViewBag 或強型別模型接收資料。Razor 語法 (@model, @Html) 提供流暢編碼體驗。
MVC 無 ViewState,表單提交為標準 HTTP POST。模型繫結器自動將表單值映射到動作參數或模型物件,驗證屬性 ([Required], [StringLength]) 實現伺服器/客戶端雙端驗證。
IControllerFactory 允許自訂控制器建立邏輯(如依賴注入整合)。其他管線擴展:ActionFilter、ModelBinder、ViewEngine、RouteConstraint 等,支援 AOP、領域模型驅動設計。
ASP.NET MVC 回歸 Web 本質(HTTP、HTML、無狀態),賦予開發者完全掌控權,並原生支援現代工程實踐(TDD、DI、CI/CD)。對於追求可維護、可測試、高效能的團隊,它是 Web Forms 之後的自然進化。