首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> ASP.NET 基礎 >> 關於ASP.NET

ASP.NET MVC Razor 引擎:View 動態編譯原理與組件產生機制

     編輯:關於ASP.NET

動態編譯特性

  • 首次請求觸發編譯,.cshtml/.vbhtml → 組件 (DLL)。
  • 同目錄下多個 View 編譯至同一組件 (名稱 App_Web_*)。
  • 檔案修改後首次請求觸發重新編譯。
  • 部署時需包含 .cshtml 檔案 (非預先編譯模式)。

實驗:觀察 View 編譯型別與組件

1. 擴充方法列出 View 組件

public static class HtmlHelperExtensions
{
    public static MvcHtmlString ListViewAssemblies(this HtmlHelper helper)
    {
        var ul = new TagBuilder("ul");
        foreach (var asm in AppDomain.CurrentDomain.GetAssemblies().Where(a => a.FullName.StartsWith("App_Web_")))
        {
            var li = new TagBuilder("li");
            li.InnerHtml = asm.FullName;
            ul.InnerHtml += li.ToString();
        }
        return new MvcHtmlString(ul.ToString());
    }
}

2. Controller 與 View 設置

public class FooController : Controller
{
    public ActionResult Action1() => View();
    public ActionResult Action2() => View();
}
public class BarController : Controller
{
    public ActionResult Action1() => View();
    public ActionResult Action2() => View();
}

四個 View (~/Views/Foo/Action1.cshtml 等) 內容相同:

<div>當前View類型:@this.GetType().AssemblyQualifiedName</div>
<div>當前加載的View程序集:</div>
@Html.ListViewAssemblies()

3. 依序請求結果觀察

View 編譯組件與型別輸出圖

關鍵發現:

  • 同 Controller 下 View (Foo/Action1、Foo/Action2) 編譯至同一組件,型別命名空間含 Controller 名稱 (ASP.Views_Foo_Action1_cshtml)。
  • 不同 Controller (Foo vs Bar) 編譯至不同組件 (App_Web_foo... vs App_Web_bar...)。
  • 組件命名規則:App_Web_<hash>,hash 含目錄路徑資訊。

編譯流程技術細節

  1. BuildManager 偵測虛擬路徑對應實體檔案。
  2. Razor 剖析器 (RazorTemplateEngine) 產生 C# 程式碼 (繼承 WebViewPage)。
  3. CSharpCodeProvider 編譯為組件 (臨時檔案於 Temporary ASP.NET Files)。
  4. 組件載入 AppDomain,型別快取於 BuildManager。
  5. 後續請求直接從快取取得型別,實例化執行。

預先編譯選項

  • 發佈時預先編譯:專案屬性 → 「預先編譯」/ 發佈設定勾選,產生無 .cshtml 的純 DLL 部署。
  • 效能:啟動無編譯延遲,但部署包較大。

總結

Razor View 採目錄級動態編譯,同目錄 View 共享組件,型別命名含 Controller/Action 路徑。理解編譯產物結構有助於除錯、效能調優與部署策略選擇。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved