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