💡
問題非常少見,而且錯誤訊息會誤導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-8 | UTF-8-SIG (UTF-8 with BOM) |
---|---|---|
編碼開頭 | 無特殊字元 | 有 BOM:EF BB BF 三個 byte |
是否必要 | ❌ 不需要 | ❌ 不建議使用在 Razor 或 JSON |
Razor 相容性 | ✅ 完全支援 | ⚠️ 容易誤判為語法錯誤 |
在 VS 中表現 | 預設儲存可能有 BOM | BOM 會造成 Razor 預編譯出錯 |
頁面亂碼風險 | ❌ 無風險 | ⚠️ 容易出現  等亂碼 |
Git 影響 | ✅ 乾淨 diff | ⚠️ 每次都 dirty,Git 誤判變動 |