iT邦幫忙

2026 iThome 鐵人賽

DAY 5
0

前輩看到我一臉茫然,馬上了然於心

開始熱心地一大串解釋,在我的螢幕上各種比畫比畫……

我這菜鳥只是保持尷尬又不失禮貌的微笑 ^_^

我很努力想理解,但能進到腦袋的真的不多)抱歉了前輩

總之我當下只能手邊猛抄關鍵字:

Modal(還寫錯 a!)
還有 V 什麼……喔!View!
跟 C……來不及啦!

前輩講完之後,我就默默打開我的程式助教 ^_^

……你們懂。

剛剛前輩說什麼 MVC?那是什麼?

MVC 是什麼

MVC 是一種把程式分成不同責任的架構方式

分成:

  • Model
    Model

  • View
    View

  • Controller
    Controller

先用我目前菜鳥版的方式理解:

名稱 菜鳥版理解
Model 放資料,以及和資料有關的規則
View 顯示給使用者看的畫面
Controller 接收使用者的請求,決定接下來要做什麼,再把結果交給 View

但老實說,我第一次整理完這張表格後,還是滿頭問號。

因為每一個字分開看都懂,放進專案裡就不知道它們到底怎麼合作。

所以我又繼續問:

可以用生活中的例子解釋嗎?

先用餐廳比喻理解 MVC

AI 給我的比喻是:

  • 客人:使用者 User
  • 服務生:Controller
  • 廚房與食材:Model
  • 最後送上桌的餐點:View

大概可以想成:

客人提出點餐需求
↓
服務生接收需求
↓
廚房準備資料和餐點
↓
服務生把完成的餐點送回客人面前

對應到 MVC 就是:

User 發出請求
↓
Controller 接收請求
↓
Model 提供或處理資料
↓
Controller 把資料交給 View
↓
View 顯示畫面給 User

菜鳥版流程可以先記成:

User
↓
Controller
↓
Model
↓
Controller
↓
View
↓
User

嗯……

看到這裡,我還是不禁懷疑:

用這樣學程式真的可以嗎?

各位大佬看到會不會吐血 XD

不過算了。

對現在的我來說,先知道它們大概各自在做什麼,比一開始就硬背一堆正式定義重要。

但這個比喻不是完全精準

餐廳比喻很好懂,但我後來也發現,它只能幫忙建立初步概念,不能完全等同於真正的 MVC。

例如 Model 並不只是「廚房」。

Model 可能包含:

  • 要顯示的資料
  • 接收表單的資料
  • 驗證規則
  • 資料狀態
  • 畫面需要使用的物件

而 Controller 也不只是負責把東西送來送去。

它通常還會:

  • 接收網址或表單送來的請求
  • 判斷要執行哪個 Action
  • 呼叫其他服務取得資料
  • 決定要回傳 View、JSON 或其他結果

所以更精準一點的理解是:

MVC 是把接收請求、處理資料和顯示畫面的責任拆開。

這樣每一部分的工作比較清楚,也比較容易維護。

我實際回到專案裡看了一次

餐廳比喻只是讓我更容易理解,但還是要實際回到專案中對照

到 Visual Studio 的方案總管裡,真的去找:

Models
Views
Controllers

然後開始對照資料夾內容

我在 Views 裡看到很多:

.cshtml

這些檔案裡面有熟悉的 HTML,所以我先確認:

View 確實和畫面有關。

接著我在 Controllers 裡看到很多檔名以:

Controller.cs

結尾的檔案。

例如概念上可能會看到:

HomeController.cs
UserController.cs
ProductController.cs

打開後,裡面通常會出現一些方法:

public IActionResult Index()
{
    return View();
}

雖然當時我還看不懂全部語法,但至少能先觀察到:

Controller 裡有一個 Index 方法
↓
方法最後 return View()
↓
程式會去找對應的 View 畫面

這時候,原本只存在於餐廳比喻裡的 MVC,才開始真的和專案結構連起來。

一個最基本的 MVC 流程

用最簡化的程式碼來看,Controller 可能長這樣:

public class HomeController : Controller
{
    public IActionResult Index()
    {
        return View();
    }
}

這段可以先理解成:

使用者進入首頁
↓
請求進到 HomeController
↓
執行 Index()
↓
return View()
↓
回傳首頁畫面

對應的 View 可能放在:

Views
└── Home
    └── Index.cshtml

所以目前菜鳥版可以先記成:

HomeController 的 Index()
↓
對應 Views/Home/Index.cshtml

這不是所有情況都只能這樣配對,但它是 ASP.NET Core MVC 很常見的預設慣例。

這也讓我第一次理解:

Controller 和 View 並不是隨便放在兩個資料夾裡,它們之間其實有命名和路徑上的對應關係。

Model 又在哪裡?

View 和 Controller 還算看得到。

但 Model 對我來說比較抽象。

例如 Controller 可能先建立一筆資料:

public IActionResult Index()
{
    var user = new UserViewModel
    {
        Name = "Abbie"
    };

    return View(user);
}

接著 View 可以接收這筆資料:

@model UserViewModel

<h1>@Model.Name</h1>

最後瀏覽器看到的結果可能是:

<h1>Abbie</h1>

這段流程就是:

Controller 準備 Model
↓
Controller 把 Model 傳給 View
↓
View 使用 Model 裡的資料
↓
產生 HTML 畫面

這時候我才比較理解:

Model 不只是資料庫裡的一張表,也可能是專門提供畫面使用的資料物件。

為什麼要拆成 MVC?

我又繼續問 AI:

全部寫在同一個檔案不是比較快嗎?為什麼一定要拆成三個?

AI 回答了一堆「關注點分離」、「可維護性」、「可測試性」。

我還是一樣,每個字都看得懂,但很難有感覺。

後來我用自己的工作情境去想。

假設所有東西都寫在同一個檔案:

HTML
CSS
資料庫查詢
表單驗證
按鈕事件
商業規則

全部混在一起。

專案小的時候可能還勉強看得懂。

但企業專案檔案一多、功能一大,要修改一個畫面時,就很容易不知道:

  • 這是畫面問題
  • 這是資料問題
  • 這是請求沒有進來
  • 還是程式邏輯錯了

MVC 拆開後,可以先大概判斷:

問題 優先查看
畫面排版、按鈕、文字 View
使用者操作後進到哪裡 Controller
顯示或接收哪些資料 Model
實際業務邏輯 可能在 Service 或其他類別

這裡也讓我發現:

真實的企業專案通常不會只有 Model、View、Controller 三種東西。

還可能有:

  • Service
  • Repository
  • DTO
  • ViewModel
  • Entity
  • API
  • Middleware

所以 MVC 是一個重要的起點,但不是整套企業專案的全部。

AI 在這篇幫了我什麼?

這次 AI 一開始先給我正式定義。

但我還是看不懂,所以我繼續追問:

可以用生活例子嗎?
Controller 是不是只負責傳資料?
Model 是不是就等於資料庫?
View 是不是就是 HTML?
為什麼要拆成三個?
我要怎麼在專案裡找到它們?

經過一來一回後,我才慢慢修正原本過度簡化的理解:

原本理解:
Model 就是資料庫
Controller 就是服務生
View 就是畫面

修正後:
Model 是畫面或程式需要使用的資料與規則
Controller 負責接收請求、協調處理流程並回傳結果
View 負責使用資料產生畫面

不過真正讓我懂一點的,還是回到專案裡確認:

  • Controllers 裡是不是真的有 Controller
  • Views 裡是不是有對應的 .cshtml
  • Controller 裡是否真的有 return View()
  • View 能不能接收 Model
  • 修改 View 後,畫面是否真的會改變

AI 幫我把第一層概念講簡單。

實際專案則幫我確認,這些東西不是只存在於課本裡。

菜鳥最後先記住什麼?

目前我先記得:

Controller
接收使用者的請求,決定要執行什麼

Model
提供程式或畫面需要的資料與規則

View
使用資料產生使用者看到的畫面

最基本的流程是:

User 發出請求
↓
Controller 接收請求
↓
取得或準備 Model
↓
Controller 把 Model 交給 View
↓
View 產生 HTML
↓
回傳給 User

不過看到 View,我真的有一種莫名的親切感。

就是畫面啊~~

就是眼睛看得到的東西啊~~

好,這個我至少比較熟!

所以接下來,我決定先鎖定 View 這個東西去工作。

下一篇:

View 裡為什麼不是 .html,而是一堆 .cshtml


上一篇
Day 4|前輩叫我開 `.sln`,但 `.sln`到底是什麼?
系列文
學過一點 React,卻被撈進 C#:新手用 AI 硬啃 MVC 企業專案的 3 個月實錄5
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言