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

ASP.NET MVC Razor 引擎:RazorViewEngine 視圖搜尋與快取機制

     編輯:關於ASP.NET

RazorViewEngine 繼承體系

RazorViewEngine → BuildManagerViewEngine → VirtualPathProviderViewEngine → IViewEngine。

視圖搜尋順序

一般區域 (非 Area)

  1. ~/Views/{ControllerName}/{ViewName}.cshtml
  2. ~/Views/{ControllerName}/{ViewName}.vbhtml
  3. ~/Views/Shared/{ViewName}.cshtml
  4. ~/Views/Shared/{ViewName}.vbhtml

Area 區域

  1. ~/Areas/{AreaName}/Views/{ControllerName}/{ViewName}.cshtml
  2. ~/Areas/{AreaName}/Views/{ControllerName}/{ViewName}.vbhtml
  3. ~/Areas/{AreaName}/Views/Shared/{ViewName}.cshtml
  4. ~/Areas/{AreaName}/Views/Shared/{ViewName}.vbhtml
  5. 找不到則回退至一般區域搜尋順序。

Partial View、Layout 檔案同樣套用此搜尋邏輯。

FindView / FindPartialView 實作邏輯

  1. 取得 controllerName、areaName (可選)。
  2. 依順序組合虛擬路徑清單。
  3. 逐一 Request.MapPath 檢查實體檔案是否存在。
  4. 找到則建立 RazorView(virtualPath) 封裝為 ViewEngineResult 回傳。
  5. 全找不到則回傳含搜尋路徑的 ViewEngineResult (供錯誤頁面顯示)。

ReleaseView 釋放機制

public void ReleaseView(ControllerContext controllerContext, IView view)
{
    var disposable = view as IDisposable;
    if (disposable != null) disposable.Dispose();
}

UML 關係圖

Razor 引擎相關類型 UML 關係圖

簡易實作:SimpleRazorViewEngine

public class SimpleRazorViewEngine : IViewEngine
{
    private string[] viewLocationFormats = new[] {
        "~/Views/{1}/{0}.cshtml", "~/Views/{1}/{0}.vbhtml",
        "~/Views/Shared/{0}.cshtml", "~/Views/Shared/{0}.vbhtml" };
    private string[] areaViewLocationFormats = new[] {
        "~/Areas/{2}/Views/{1}/{0}.cshtml", "~/Areas/{2}/Views/{1}/{0}.vbhtml",
        "~/Areas/{2}/Views/Shared/{0}.cshtml", "~/Areas/{2}/Views/Shared/{0}.vbhtml" };

    public ViewEngineResult FindPartialView(ControllerContext controllerContext, string partialViewName, bool useCache)
        => FindView(controllerContext, partialViewName, null, useCache);

    public ViewEngineResult FindView(ControllerContext controllerContext, string viewName, string masterName, bool useCache)
    {
        string controllerName = controllerContext.RouteData.GetRequiredString("controller");
        object areaName;
        var viewLocations = new List<string>();
        Array.ForEach(viewLocationFormats, f => viewLocations.Add(string.Format(f, viewName, controllerName)));
        if (controllerContext.RouteData.Values.TryGetValue("area", out areaName))
            Array.ForEach(areaViewLocationFormats, f => viewLocations.Add(string.Format(f, viewName, controllerName, areaName)));
        
        foreach (var loc in viewLocations)
        {
            string filePath = controllerContext.HttpContext.Request.MapPath(loc);
            if (File.Exists(filePath))
                return new ViewEngineResult(new SimpleRazorView(loc), this);
        }
        return new ViewEngineResult(viewLocations);
    }

    public void ReleaseView(ControllerContext controllerContext, IView view)
    {
        var disposable = view as IDisposable;
        if (disposable != null) disposable.Dispose();
    }
}

快取機制

BuildManagerViewEngine 內建快取:useCache=true 時,檔案存在性檢查結果與編譯型別快取於 BuildManager。生產環境預設開啟,開發環境可關閉 (compilation debug="true")。

總結

RazorViewEngine 以慣例優於配置定義視圖搜尋路徑,支援 Area 階層與回退機制。FindView 核心為虛擬路徑對應實體檔案檢查,找到則建立 RazorView。理解搜尋順序可正確組織專案結構,避免視圖衝突。

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