ASP.NET MVC Razor 錯誤分析

💡
問題非常少見,而且錯誤訊息會誤導Debug方向,一開始以為是Razor架構少了一個大括號之類錯誤,但是在純HTML架構下,網頁又不會出現錯誤,開始排查Model對應的物件錯誤,也並非物件NULL錯誤,直到看見HTML文字是亂碼才發現有貓膩,藉助GitHub Copilot產生的cshtml檔案會有不一樣的格式!

🧩 1. 問題錯誤訊息

在 ASP.NET MVC 專案中載入某個 .cshtml 檔案時,出現以下錯誤訊息:

[System.Web.HttpParseException] 
"The using block is missing a closing '}' character.  
Make sure you have a matching '}' character for all the '{' characters within this block, and that none of the '}' characters are being interpreted as markup."

🕵️ 2. 第一層排除:檢查 Razor 文件語法結構

開發者檢查 .cshtml 檔案時,確認以下狀況:

  • 所有 {} 配對正確
  • 所有 @{}@using {} 等 Razor 語法都已完整關閉
  • JavaScript 區塊與 HTML 結構完整
  • Visual Studio 也無任何 IntelliSense 提示錯誤

✅ 結論:語法檢查皆正確,但錯誤依然出現


🔬 3. 深入分析:Razor 預編譯錯誤

從 stack trace 可得知,錯誤源自 Razor 編譯階段,而非執行階段或控制器層:

System.Web.WebPages.Razor.RazorBuildProvider.EnsureGeneratedCode()
  • 問題發生在 Razor 預處理與建構 .cshtml 編譯階段
  • 與控制器、ViewModel 或 runtime 執行邏輯無關
  • 更可能是 檔案格式、隱藏字元或不當編碼所致

🧨 4. 真正原因:.cshtml 檔案為 UTF-8-SIG 格式(含 BOM)

透過 GitHub Copilot 生成的 .cshtml 頁面,預設儲存格式為:

UTF-8 with BOM(又稱 UTF-8-SIG

這會導致以下 Razor 特有錯誤:

錯誤表現說明
Razor 解譯錯誤Razor 無法解析 BOM 隱藏位元組,誤判語法
錯誤訊息誤導雖然錯誤說「少了大括號」,實際上是 BOM 字元干擾 Razor 編譯器
頁面顯示亂碼有些瀏覽器在顯示 HTML 頁面時,會把 BOM 渲染成 

🧭 5. BOM 是什麼?UTF-8 vs UTF-8-SIG 差異說明

項目UTF-8UTF-8-SIG (UTF-8 with BOM)
編碼開頭無特殊字元有 BOM:EF BB BF 三個 byte
是否必要❌ 不需要❌ 不建議使用在 Razor 或 JSON
Razor 相容性✅ 完全支援⚠️ 容易誤判為語法錯誤
在 VS 中表現預設儲存可能有 BOMBOM 會造成 Razor 預編譯出錯
頁面亂碼風險❌ 無風險⚠️ 容易出現  等亂碼
Git 影響✅ 乾淨 diff⚠️ 每次都 dirty,Git 誤判變動
Author image
關於 Richard Zheng
您已成功訂閱 Richard's NoteBook
歡迎回來!您已成功登入。
無法讓您登入。請再試一次。