公司有一套已運行多年的內部管理系統,原本是 Windows Forms 應用程式,現在決定整個搬到 Web 平台;新系統起初以 ASP.NET MVC + Razor Page 為主架構,同時也有部分功能採用 Web API 的形式,形成了一種混搭的局面;這讓我開始思考這兩種做法的本質差異是什麼?在什麼情況下應該選哪一種?在討論這個問題之前,得先把 MVC 架構弄清楚。


MVC 是什麼?

MVC 是一種將應用程式切分成三個層次的架構模式:

  • Model:應用程式的核心,負責管理資料、業務規則與邏輯,獨立於使用者介面
  • View:資料的視覺呈現,在 ASP.NET 中就是 Razor Page(.cshtml
  • Controller:中間協調者,接收使用者輸入、呼叫 Model 處理、再選擇適合的 View 回應

這三層緊密協作,最關鍵的特點是:整個渲染過程發生在伺服器端,瀏覽器只負責顯示已經組好的 HTML。

瀏覽器 ──請求──▶ Controller ──呼叫──▶ Model(業務邏輯 + 資料存取)
                    │                        │
                    │                        ▼
                    │                 DB / Repository
                    │                        │
                    │◀────── 資料 ───────────┘
                    │
                    ▼ 傳遞資料
                  View(Razor Page)
                    │
瀏覽器 ◀──完整 HTML──┘

用 ASP.NET Core MVC 來說明

一個典型的 MVC 流程如下:

Controller:呼叫 Model 取得資料、選擇 View

 1public class ProductController : Controller
 2{
 3    private readonly AppDbContext _db;
 4    public ProductController(AppDbContext db) => _db = db;
 5
 6    public IActionResult Index()
 7    {
 8        // 1. 從 Model 層取得資料
 9        var products = _db.Products.ToList();
10
11        // 2. 把資料傳給 View 渲染
12        return View(products);
13    }
14}

View:接收 Model 傳來的資料,產生 HTML

1@model List<Product>
2
3@foreach (var p in Model)
4{
5    <div class="product-card">
6        <span>@p.Name</span>
7        <span>$@p.Price</span>
8    </div>
9}

整個流程發生在後端,瀏覽器收到的是已經填好資料的完整 HTML 頁面。


MVC 的優點

架構直觀,上手快

整個專案在同一個 Codebase 裡,資料流向清楚:Request 進來 → Controller 處理 → Model 取資料 → View 渲染 → HTML 回傳,對剛接觸 Web 開發的人來說,這條線很好追蹤。

首次載入速度快

瀏覽器收到 HTML 即可開始渲染,不需要先下載 JavaScript bundle、再打 API 取資料、再渲染畫面這三個步驟,對網路環境不穩定的使用者來說體驗差異特別明顯。

狀態管理簡單

Session、Cookie、身份驗證由後端統一管理,不需要在前端額外維護。

安全邊界清楚

敏感的商業邏輯和資料處理都在後端,不需要擔心敏感資料被暴露在前端程式碼或網路請求中。


MVC 的缺點

前後端高度耦合

Controller 知道有哪些 View 存在,View 又直接依賴 Model 的資料結構,這種相互依賴使得修改任何一層都可能波及其他層。

1// 改了 Model 的資料結構
2// → View 的顯示邏輯可能要跟著改
3// → Controller 的取資料邏輯可能也要調整
4// 牽一髮動全身
5return View("ProductList", products);

互動體驗受限

傳統 MVC 的每次操作,預設都會觸發整頁重新載入(Full Page Reload),對於需要即時回饋的互動如表單驗證、動態搜尋、拖拉排序等,體驗相對較差;雖然可以加入 AJAX 來局部更新,但這本質上是在 MVC 上補丁而非根本解法。

難以支援多端

同一套商業邏輯,如果要同時服務網頁、iOS App、Android App,MVC 就顯得力不從心,因為它只能吐出 HTML,而 App 需要的是資料(JSON)。

大型團隊協作困難

前端工程師和後端工程師可能需要修改同一個 Controller 或同一份 View 檔案,容易產生衝突,也難以真正平行開發。

測試邊界模糊

當 Controller 裡夾雜了太多商業邏輯,測試時必須連同 View 渲染邏輯一起考慮,單元測試的邊界就變得不清晰。


MVC 適合什麼情境?

綜合以上來說,MVC 並非過時的技術,它在特定情境下仍然是務實的選擇:

  • 適合
    • 內部管理系統(使用者固定)
    • 小型全端團隊
    • 以表單和報表為主的功能
  • 不適合
    • 需要支援 App 或第三方 API
    • 需要高度互動的 SPA 體驗
    • 大型前後端分工的團隊
    • 需要即時更新的動態功能

以我們的 WinForms 遷移專案來說,MVC 其實相當符合需求:使用者是固定的內部員工、畫面以表單和清單為主、當下沒有多端需求,這些特性都算是 MVC 的適用範圍。


MVC 是一個設計思路清晰、適合特定場景的架構,但它並非萬能;當應用程式的需求超出它的適用範圍,例如需要支援多端、需要複雜互動、需要大型團隊分工等,就需要考慮別的方向;下一篇我們將探討另一個方向:前後端分離架構。