前面看了一大堆陌生的東西。
先不管它!!
畢竟我前十年都在搞畫面的,現在終於看到一個好像比較接近我熟悉領域的東西。
所以我決定先從負責畫面的地方開始找。
打開 MVC 專案後,會看到一個叫做:
Views
的資料夾。

裡面放了一堆 .cshtml 檔案。
看到這裡,我終於有一點熟悉的感覺:
好,至少還有 HTML 可以看。
但仔細一看,又覺得不太對……
為什麼不是我熟悉的 .html?
前面怎麼又多了一個 cs?
.html 和 .cshtml 差在哪裡?我第一次看到 .cshtml 的時候,心裡想的是:
這不就是
.html前面多了一個cs嗎?
於是當然又跑去問 AI:
.html和.cshtml到底差在哪裡?
一般的 .html,主要用來描述網頁的內容與結構。
例如:
<h1>最新消息</h1>
<p>這是一段文字</p>
這些都是我以前比較熟悉的東西。
標題、段落、按鈕、表格……
就是使用者最後在畫面上看得到的內容。
但 .cshtml 除了可以寫 HTML,還可以混合 Razor 語法和 C# 程式碼。
所以它不只是固定的靜態畫面,還能根據後端傳進來的資料,產生不同的 HTML。
菜鳥版先這樣理解:
| 檔案 | 主要用途 |
|---|---|
.html |
直接撰寫固定的網頁內容與結構 |
.cshtml |
在 HTML 裡搭配 Razor 和 C#,根據資料動態產生畫面 |
不過這不代表 .html 完全不能做動態畫面。
前端也可以透過 JavaScript 呼叫 API,再更新 HTML。
這裡的差別比較像是:
.cshtml會先在伺服器端處理 Razor 和 C#,再把產生好的 HTML 傳給瀏覽器。
陌生名詞又出現了。
我繼續問:
Razor 又是什麼?
我先用菜鳥版理解成:
Razor 是一套讓
.cshtml可以混合 HTML 和 C# 的語法。
它最明顯的特徵,就是常常會看到:
@
例如:
<h1>@Model.Title</h1>
這一行不是要讓瀏覽器直接看懂 @Model.Title。
而是伺服器會先處理 Razor,取得 Model.Title 裡的資料,再產生一般的 HTML。
假設後端傳進來的標題是:
最新消息
那最後產生給瀏覽器的 HTML,可能會變成:
<h1>最新消息</h1>
所以完整流程比較像:
.cshtml 裡寫 @Model.Title
↓
伺服器執行 Razor
↓
取得 Model 裡的 Title
↓
產生一般 HTML
↓
瀏覽器顯示畫面
這也讓我第一次比較具體地理解:
瀏覽器最後看到的不是 Razor,而是 Razor 處理後產生的 HTML。
@Model 是從哪裡來的?看到 @Model.Title 後,我又立刻冒出下一個問題:
這個 Model 又是從哪裡來的?
前一篇才剛學過 MVC。
Controller 可以準備資料,再把資料交給 View。
例如 Controller 裡可能有:
public IActionResult Index()
{
var model = new NewsViewModel
{
Title = "最新消息"
};
return View(model);
}
這裡的:
return View(model);
就是把 model 傳給 View。
接著 .cshtml 可以先宣告自己要接收哪一種 Model:
@model NewsViewModel
然後在畫面裡使用:
<h1>@Model.Title</h1>
流程可以先記成:
Controller 建立資料
↓
return View(model)
↓
.cshtml 接收到 Model
↓
使用 @Model.Title 顯示內容
這時候,前一篇學到的 MVC 才真的開始和 .cshtml 連起來。
除了顯示資料,Razor 還可以根據條件決定要產生哪一段 HTML。
例如:
@if (Model.IsLogin)
{
<p>歡迎回來</p>
}
else
{
<p>請先登入</p>
}
這段可以先理解成:
如果 IsLogin 是 true
↓
產生「歡迎回來」
否則
↓
產生「請先登入」
假設使用者已經登入,最後送到瀏覽器的 HTML 可能是:
<p>歡迎回來</p>
沒有被選中的那一段,不會一起出現在最後的 HTML 裡。
這點和單純用 CSS 隱藏內容不太一樣。
因為 Razor 是在伺服器產生 HTML 的階段,就先決定要輸出哪一段。
Razor 還可以搭配 C# 的 foreach 迴圈,根據資料數量重複產生 HTML。
例如:
@foreach (var item in Model.Users)
{
<p>@item.Name</p>
}
假設 Model.Users 裡有三個人:
小美
小明
小華
最後產生的 HTML 可能是:
<p>小美</p>
<p>小明</p>
<p>小華</p>
流程就是:
Model.Users 裡有多筆資料
↓
foreach 一筆一筆取出來
↓
每一筆產生一個 <p>
↓
瀏覽器顯示完整名單
看到這裡,我原本很想直接下結論:
所以
.cshtml就是高級版 HTML!
但這個說法雖然好懂,還是不太精準。
比較準確的理解應該是:
.cshtml是 Razor View 檔案,可以在伺服器端把 HTML、Razor 和 C# 結合起來,產生最後要回傳給瀏覽器的 HTML。
我不想只停在 AI 的說明,所以又回到專案裡做一個簡單測試。
我先在 .cshtml 裡寫:
@{
var message = "這是 Razor 產生的文字";
}
<h1>@message</h1>
啟動網站後,瀏覽器畫面顯示:
這是 Razor 產生的文字
接著我打開瀏覽器的開發者工具,查看網頁原始內容。
看到的是:
<h1>這是 Razor 產生的文字</h1>
而不是:
<h1>@message</h1>
這樣就確認了:
Razor 是在伺服器端先被處理,瀏覽器最後只會收到一般 HTML。
這個驗證很重要。
不然我很容易只記得「.cshtml 可以寫 C#」,卻不知道這些語法到底是在什麼時候執行。
.cshtml 裡的 C# 可以隨便寫嗎?看到 .cshtml 可以寫 C# 後,我差點又誤解成:
那我是不是所有邏輯都可以直接寫在畫面裡?
技術上確實可以在 Razor View 裡寫不少 C#。
但不代表適合把所有事情都塞進去。
例如:
如果全部寫在 .cshtml,畫面檔案會變得很難閱讀和維護。
所以 View 比較適合負責:
比較複雜的流程,通常會放在 Controller、Service 或其他類別裡處理。
這也再次呼應 MVC 的概念:
View 主要負責顯示,不是什麼事情都自己做。
.cshtml 和 React 的 JSX 有點像嗎?因為我以前學過 React,所以看到 .cshtml 混合 HTML 和程式語法時,也忍不住想到 JSX。
例如 React 裡可能會寫:
<h1>{title}</h1>
Razor 裡則可能寫:
<h1>@Model.Title</h1>
兩者都能把資料放進畫面,也能寫條件和迴圈。
但它們的執行方式不一樣。
Razor .cshtml |
React JSX |
|---|---|
| 通常由伺服器處理後產生 HTML | 通常由前端 JavaScript 建立或更新畫面 |
常使用 @Model 取得資料 |
常使用 props、state 或 API 資料 |
| 屬於 ASP.NET Core MVC 的 View | 屬於 React 元件語法 |
所以可以用既有經驗幫助理解,但不能把它們直接當成同一個東西。
菜鳥版先記:
它們都可以把資料放進畫面,但背後的執行位置和流程不一樣。
這次我一開始只問:
.html和.cshtml差在哪裡?
但問下去之後,又一路冒出很多新問題:
Razor 是什麼?
@Model從哪裡來?
@if是在瀏覽器執行嗎?
foreach最後會產生什麼?
.cshtml是不是高級版 HTML?
它和 React JSX 是不是一樣?
我會先把自己的理解丟回去確認。
例如:
所以 Razor 就是一個翻譯橋樑,把 C# 翻成 HTML?
AI 再幫我修正:
這個比喻可以幫助理解,但更精準地說,Razor 是一套 View 樣板語法與處理機制。
它會執行 .cshtml 裡的 Razor 和 C#,最後產生 HTML。
最後我再回到專案裡,透過瀏覽器開發者工具確認:
.cshtml 原本寫的是 @message
↓
伺服器處理 Razor
↓
瀏覽器收到的是一般 HTML
這樣我才不是只背一句:
.cshtml可以寫 C#。
而是真的知道它最後怎麼變成使用者看到的畫面。
目前我先記得:
.html
主要描述固定的網頁內容與結構
.cshtml
可以混合 HTML、Razor 和 C#
由伺服器處理後產生 HTML
最基本的流程是:
Controller 準備 Model
↓
把 Model 傳給 View
↓
.cshtml 使用 Razor 讀取資料
↓
產生一般 HTML
↓
瀏覽器顯示畫面
常見 Razor 語法包括:
@Model.Title
顯示資料。
@if (...)
{
}
根據條件決定要產生什麼內容。
@foreach (...)
{
}
根據資料數量重複產生畫面。
好,至少畫面的部分,我終於開始有一點感覺了。
然後下一個問題馬上出現:
CSS 在哪裡?
我在 Views 裡翻來翻去,完全沒有看到熟悉的 .css。
難道要自己建立嗎?
下一篇:
CSS人呢?原來它藏在wwwroot