iT邦幫忙

2026 iThome 鐵人賽

DAY 6
0
佛心分享-IT 人自學之術

學過一點 React,卻被撈進 C#:新手用 AI 硬啃 MVC 企業專案的 3 個月實錄系列 第 6

Day 6|先從最熟悉的畫面開始:HTML 和 `.cshtml` 差在哪裡?

  • 分享至 

  • xImage
  •  

前面看了一大堆陌生的東西。

先不管它!!

畢竟我前十年都在搞畫面的,現在終於看到一個好像比較接近我熟悉領域的東西。

所以我決定先從負責畫面的地方開始找。

打開 MVC 專案後,會看到一個叫做:

Views

的資料夾。

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 又是什麼?

我先用菜鳥版理解成:

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 可以寫條件判斷

除了顯示資料,Razor 還可以根據條件決定要產生哪一段 HTML。

例如:

@if (Model.IsLogin)
{
    <p>歡迎回來</p>
}
else
{
    <p>請先登入</p>
}

這段可以先理解成:

如果 IsLogin 是 true
↓
產生「歡迎回來」

否則
↓
產生「請先登入」

假設使用者已經登入,最後送到瀏覽器的 HTML 可能是:

<p>歡迎回來</p>

沒有被選中的那一段,不會一起出現在最後的 HTML 裡。

這點和單純用 CSS 隱藏內容不太一樣。

因為 Razor 是在伺服器產生 HTML 的階段,就先決定要輸出哪一段。

Razor 也可以重複產生畫面

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。

我實際怎麼確認 Razor 最後會變成 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 元件語法

所以可以用既有經驗幫助理解,但不能把它們直接當成同一個東西。

菜鳥版先記:

它們都可以把資料放進畫面,但背後的執行位置和流程不一樣。

AI 在這一篇幫了我什麼?

這次我一開始只問:

.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


上一篇
Day 5|前輩問我知道MVC嗎,我回:蛤?
系列文
學過一點 React,卻被撈進 C#:新手用 AI 硬啃 MVC 企業專案的 3 個月實錄6
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言