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

ASP.NET MVC ViewEngine 演進史:從 MVC 1 手工渲染到 Razor 編譯優化

     編輯:關於ASP.NET

ViewEngine 負責「模板定位 → 編譯/解析 → 渲染輸出」全流程。本文回顧 MVC 1 時代的原始實現,對比現代 Razor 引擎的架構優勢。

MVC 1 時代:手工字串拼接

早期 WebFormViewEngine 核心邏輯極其樸素:

public void RenderView(ViewContext viewContext) {
    string viewLocation = ViewLocator.GetViewLocation(viewContext, viewContext.ViewName);
    string viewPath = viewContext.HttpContext.Request.MapPath(viewLocation);
    string viewTemplate = File.ReadAllText(viewPath); // 讀取檔案
    IRenderer renderer = new PrintRenderer();
    viewTemplate = renderer.Render(viewTemplate, viewContext); // 正則替換 <%= %> 標記
    viewContext.HttpContext.Response.Write(viewTemplate); // 直接輸出
}

MVC 1 ViewEngine 流程圖

  • 無編譯緩存:每請求必讀檔、正則解析、字串拼接。
  • PrintRenderer 以正則匹配 <%= ... %>,效能差、功能弱(不支援邏輯控制流)。
  • Controller 透過 ViewDataDictionary 傳遞資料,型別不安全。

MVC 2/3:WebFormViewEngine 改良

  • 引入 BuildManager 動態編譯 .aspx/.ascx 為類別,首次請求編譯後快存,後續請求直接實例化執行。
  • 支援 Master Page、User Control、強型別 ViewPage<TModel>。
  • 但 ASPX 語法冗長(<%: %>, <% %>),HTML 與代碼混雜,智能提示弱。

MVC 3+:Razor 引擎革命

Razor 架構圖

  • 語法精簡:@model, @foreach, @if, @Html.Partial(),無需閉合標記。
  • 編譯優化:Razor 解析器生成 C# 類別,經 Roslyn 編譯為 DLL,極致效能。
  • 智能提示:Visual Studio 完整支援 IntelliSense、重構、語法高亮。
  • Layout/Section:替代 Master Page,更靈活的版面組合。

自定義 ViewEngine 實戰場景

  • 多租戶主題:依租戶 ID 解析不同 Views 目錄。
  • 裝置適配:行動裝置返回 .Mobile.cshtml。
  • 插件化模組:從組件嵌入資源載入視圖。
public class ThemedRazorViewEngine : RazorViewEngine {
    public ThemedRazorViewEngine(string theme) {
        ViewLocationFormats = new[] {
            $"~/Themes/{theme}/Views/{{1}}/{{0}}.cshtml",
            $"~/Themes/{theme}/Views/Shared/{{0}}.cshtml"
        };
    }
}
// Global.asax 註冊
ViewEngines.Engines.Clear();
ViewEngines.Engines.Add(new ThemedRazorViewEngine("Default"));

效能對比關鍵指標

指標MVC 1 (字串)WebFormViewEngineRazor
首次請求延遲低(無編譯)高(動態編譯)高(解析+編譯)
後續請求吞吐極低中(快取類別)高(強型別、優化 IL)
記憶體佔用低中中(編譯組件)
開發體驗差一般優

總結

從字串替換到動態編譯,再到 Roslyn 編譯管線,ViewEngine 演進見證了「約定優於配置」與「開發體驗至上」的工程哲學。現代專案強烈建議全面採用 Razor,舊專案可漸進式遷移(同專案共存 ASPX/Razor)。

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