ASP.NET MVC Razor 編譯錯誤與 BOM 問題

💡
這個問題很少見,錯誤訊息也讓除錯方向偏掉。我起初以為 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. 從 stack trace 確認編譯階段

從 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

BOM 會讓 Razor 出現以下狀況:

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

5. UTF-8 與 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
About me 喜歡爬山,瑜伽,溜冰,喜歡新奇的事,最喜歡的還是寫程式帶來的成就感,對於資訊會不斷的出現新事物也能抱持好奇與熱忱。近期開始將學習的心得寫在Blog,發現思路更清晰也加深了記憶。 紙上得來終覺淺,絕知此事要躬行