程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> ASP.NET >> 關於ASP.NET >> ASP.NET MVC的Razor引擎:RazorView

ASP.NET MVC的Razor引擎:RazorView

編輯:關於ASP.NET

Razor引擎具有兩個核心的類型,一個是表示View本身的類型RazorView,另一個則是獲取和創建它的RazorViewEngine,我們將用兩篇文章對它們分別進行剖析。Razor引擎下的View通過類型RazorView表示,它與表示Web Form引擎View的類型WebFormView都是BuildManagerCompiledView的子類。

一、BuildManagerCompiledView

為了能夠清楚地說明實現在BuildManagerCompiledView中的View激活與呈現機制,我們列出了BuildManagerCompiledView中與此相關的內部和受保護的成員。

   1: public abstract class BuildManagerCompiledView : IView
2: {
3: internal IViewPageActivator ViewPageActivator;
4:
5: protected BuildManagerCompiledView(ControllerContext controllerContext, string viewPath);
6: protected BuildManagerCompiledView(ControllerContext controllerContext, string viewPath, IViewPageActivator viewPageActivator);
7: internal BuildManagerCompiledView(ControllerContext controllerContext, string viewPath, IViewPageActivator viewPageActivator, IDependencyResolver dependencyResolver);
8:
9: public void Render(ViewContext viewContext, TextWriter writer);
10: protected abstract void RenderView(ViewContext viewContext, TextWriter writer, object instance);
11:
12: internal IBuildManager BuildManager { get; set; }
13: public string ViewPath { get; protected set; }
14: }

通過《View編譯原理》的介紹我們知道采用Razor引擎的View文件(.cshtml或者.vbhtml)最終都會編譯成一個WebViewPage類型,所以通過RazorView/WebFormView體現的View的呈現機制最終體現在對WebViewPage對象的激活。我們可以利用BuildManager根據View文件的虛擬路徑得到編譯後的類型。從名稱也可以看出來,BuildManagerCompiledView內部就是利用了BuildManager根據指定的View文件虛擬路徑完成對WebViewPage對象激活。

BuildManagerCompiledView的屬性ViewPath表示的就是View文件的虛擬路徑,該屬性在構造函數中被初始化。BuildManagerCompiledView具有三個構造函數,對象本身的構造邏輯體現在內部構造函數上。如上面的代碼片斷所示,除了將當前ControllerContext和View文件虛擬路徑作為構造函數的參數之外,該構造函數還具有額外兩個參數,其類型分別是IViewPageActivator和IDependencyResolver。

   1: public interface IViewPageActivator
2: {
3: object Create(ControllerContext controllerContext, Type type);
4: }

上面的代碼片斷體現了接口IViewPageActivator的定義。顧名思義,該接口旨在實現對WebViewPage對象的激活,基於類型的對象激活機制實現在Create方法中。BuildManagerCompiledView的構造函數中指定的ViewPageActivator被用於初始化內部字段ViewPageActivator,如果沒有通過構造函數顯式指定ViewPageActivator對象,默認采用的是一個DefaultViewPageActivator對象。

DefaultViewPageActivator是一個具有如下定義的內部類型,我們可以看到它實際上依賴於一個DependencyResolver對象完成針對WebViewPage對象的激活。這個DependencyResolver對象可以通過構造函數進行顯式設置,而默認使用的DependencyResolver對象來源於DependencyResolver類型的靜態屬性Current。

   1: internal class DefaultViewPageActivator : IViewPageActivator
2: {
3: private Func<IDependencyResolver> _resolverThunk;
4: public DefaultViewPageActivator() : this(null)
5: {}
6: 
7: public DefaultViewPageActivator(IDependencyResolver resolver)
8: {
9: Func<IDependencyResolver> func = null;
10: if (resolver == null)
11: {
12: this._resolverThunk = () => DependencyResolver.Current;
13: }
14: else
15: {
16: if (func == null)
17: {
18: func = () => resolver;
19: }
20: this._resolverThunk = func;
21: }
22: }
23: 
24: public object Create(ControllerContext controllerContext, Type type)
25: {
26: return (this._resolverThunk().GetService(type) ?? Activator.CreateInstance(type));
27: }
28: }

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved