RazorView / WebFormView → BuildManagerCompiledView → IView。
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; }
}
public interface IViewPageActivator
{
object Create(ControllerContext controllerContext, Type type);
}
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);
}
RazorView.Render(viewContext, writer) 呼叫基類 BuildManagerCompiledView.Render。Render:public void Render(ViewContext viewContext, TextWriter writer)
{
var instance = ViewPageActivator.Create(viewContext.ControllerContext, viewType);
RenderView(viewContext, writer, instance);
}
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 編譯產生的程式碼
}
BuildManagerCompiledView 內部透過 BuildManager.GetCompiledType(ViewPath) 取得編譯後的 WebViewPage 型別,傳給 Activator。
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);
}
}
Html、Url、Model、ViewBag 等 Helper 屬性,ExecutePageHierarchy 驅動渲染。RazorView 透過 BuildManagerCompiledView 基類實現「編譯→激活→渲染」標準流程。IViewPageActivator 為擴充點,預設整合 DependencyResolver 實現 IoC。掌握此機制可自訂 View 基類、激活邏輯或渲染管線。