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

ASP.NET MVC Razor 引擎:RazorView 與 BuildManagerCompiledView 激活渲染機制

     編輯:關於ASP.NET

RazorView 繼承體系

RazorView / WebFormView → BuildManagerCompiledView → IView。

BuildManagerCompiledView 核心成員

public abstract class BuildManagerCompiledView : IView
{
    internal IViewPageActivator ViewPageActivator;
    
    protected BuildManagerCompiledView(ControllerContext controllerContext, string viewPath);
    protected BuildManagerCompiledView(ControllerContext controllerContext, string viewPath, IViewPageActivator viewPageActivator);
    internal BuildManagerCompiledView(ControllerContext controllerContext, string viewPath, IViewPageActivator viewPageActivator, IDependencyResolver dependencyResolver);
    
    public void Render(ViewContext viewContext, TextWriter writer);
    protected abstract void RenderView(ViewContext viewContext, TextWriter writer, object instance);
    
    internal IBuildManager BuildManager { get; set; }
    public string ViewPath { get; protected set; }
}

IViewPageActivator 介面

public interface IViewPageActivator
{
    object Create(ControllerContext controllerContext, Type type);
}

DefaultViewPageActivator 實作

internal class DefaultViewPageActivator : IViewPageActivator
{
    private Func<IDependencyResolver> _resolverThunk;
    public DefaultViewPageActivator() : this(null) { }
    public DefaultViewPageActivator(IDependencyResolver resolver)
    {
        if (resolver == null) _resolverThunk = () => DependencyResolver.Current;
        else _resolverThunk = () => resolver;
    }
    public object Create(ControllerContext controllerContext, Type type)
        => _resolverThunk().GetService(type) ?? Activator.CreateInstance(type);
}

渲染流程

  1. RazorView.Render(viewContext, writer) 呼叫基類 BuildManagerCompiledView.Render。
  2. 基類 Render:
public void Render(ViewContext viewContext, TextWriter writer)
{
    var instance = ViewPageActivator.Create(viewContext.ControllerContext, viewType);
    RenderView(viewContext, writer, instance);
}
  1. RazorView.RenderView (覆寫):
protected override void RenderView(ViewContext viewContext, TextWriter writer, object instance)
{
    var webViewPage = (WebViewPage)instance;
    webViewPage.VirtualPath = ViewPath;
    webViewPage.ViewContext = viewContext;
    webViewPage.InitHelpers();
    webViewPage.ExecutePageHierarchy(); // 執行 Razor 編譯產生的程式碼
}

View 編譯型別取得

BuildManagerCompiledView 內部透過 BuildManager.GetCompiledType(ViewPath) 取得編譯後的 WebViewPage 型別,傳給 Activator。

簡易實作:SimpleRazorView

public class SimpleRazorView : IView
{
    private string _viewPath;
    public SimpleRazorView(string viewPath) { _viewPath = viewPath; }
    
    public void Render(ViewContext viewContext, TextWriter writer)
    {
        string content = File.ReadAllText(viewContext.HttpContext.Request.MapPath(_viewPath));
        // 簡易模擬:直接輸出檔案內容 (實際需編譯執行)
        writer.Write(content);
    }
}

關鍵設計點

  • 編譯與激活分離:BuildManager 負責動態編譯 .cshtml 為型別,Activator 負責建構實例。
  • IoC 整合點:DefaultViewPageActivator 透過 DependencyResolver 解析,支援容器管理 View 生命週期。
  • WebViewPage 基類:提供 Html、Url、Model、ViewBag 等 Helper 屬性,ExecutePageHierarchy 驅動渲染。

總結

RazorView 透過 BuildManagerCompiledView 基類實現「編譯→激活→渲染」標準流程。IViewPageActivator 為擴充點,預設整合 DependencyResolver 實現 IoC。掌握此機制可自訂 View 基類、激活邏輯或渲染管線。

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