日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
逃脫Asp.NetMVC框架枷鎖使用Razor視圖引擎

此文應(yīng)該算Razor引擎淺析的續(xù)篇,或者說(shuō)淺析是此文的前傳。

創(chuàng)新互聯(lián)建站專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于成都網(wǎng)站設(shè)計(jì)、網(wǎng)站制作、新邵網(wǎng)絡(luò)推廣、微信小程序、新邵網(wǎng)絡(luò)營(yíng)銷、新邵企業(yè)策劃、新邵品牌公關(guān)、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運(yùn)營(yíng)等,從售前售中售后,我們都將竭誠(chéng)為您服務(wù),您的肯定,是我們最大的嘉獎(jiǎng);創(chuàng)新互聯(lián)建站為所有大學(xué)生創(chuàng)業(yè)者提供新邵建站搭建服務(wù),24小時(shí)服務(wù)熱線:028-86922220,官方網(wǎng)址:www.cdcxhl.com

為什么要這么做?

1. Asp.Net MVC 其實(shí)也不是太好

2. 我有自己的敏捷Web框架, 仍然想用Razor引擎

3. 動(dòng)態(tài)編譯很有意思,這也是將來(lái)的一個(gè)趨勢(shì),如果有人有興趣,我倒是很想寫(xiě)寫(xiě)這方面的內(nèi)容.

可是也有這些想法的人并不多,找來(lái)找去,這方面的資料和論述極其之少。與其臨淵羨魚(yú),不如退而結(jié)網(wǎng)。自己動(dòng)手,豐衣足食。

如Razor引擎淺析所述,Razor的兩大主要功能,模板文件和動(dòng)態(tài)編譯器。我們能不能單純就要而且只要這倆主要特性? 其它那些智能查找視圖文件等,雖不能說(shuō)是垃圾,也是束縛手腳的條條框框,我完全可以自己做,失去的是一條繩索,獲得是整個(gè)世界。

保持模板功能,特別是設(shè)計(jì)時(shí)智能語(yǔ)法支持,很簡(jiǎn)單,創(chuàng)建項(xiàng)目時(shí)選擇MVC項(xiàng)目,然后把其它MVC相關(guān)的引用刪掉只剩下Razor就好了。

編譯? 你根本就找不到這一段代碼,被淹沒(méi)在大量的輔助代碼中。幸好,我這里已經(jīng)找到了,簡(jiǎn)化修改之后,就剩下了了幾行,你就可以直接使用在甚至不必是Web項(xiàng)目中。

首先, 用到的Razor域名空間。

 
 
 
  1. using System.Web.Razor;  
  2. using System.Web.Razor.Generator;  
  3. using System.Web.Razor.Parser; 

第一步,動(dòng)態(tài)編譯:解析視圖文件,生成代碼,是的,生成代碼,先。Razor的語(yǔ)法可以說(shuō)是私有語(yǔ)法,需要先生成標(biāo)準(zhǔn)代碼,然后才編譯,生成我們熟悉的C#類Type。需要注意的是,我下面代碼用的模板基類是我自己的TeamplateBase,后面會(huì)給出簡(jiǎn)單實(shí)現(xiàn),當(dāng)然,好處就是靈活性。你也可以直接用Asp.Net MVC的System.Web.Mvc.WebViewPage, 不過(guò)我沒(méi)有試過(guò),也許會(huì)有其他問(wèn)題,不能保證。

 
 
 
  1. public static Type Compile(string template_path)  
  2.       {  
  3.           //準(zhǔn)備臨時(shí)類名,讀取模板文件和Razor代碼生成器  
  4.           var class_name = "c" + Guid.NewGuid().ToString("N");  
  5.           var base_type = typeof(TemplateBase<>).MakeGenericType(typeof(T));  
  6.           var template = File.ReadAllText(template_path);  
  7.    
  8.           var host = new RazorEngineHost(new CSharpRazorCodeLanguage(), () => new HtmlMarkupParser())  
  9.                          {  
  10.    
  11.                              DefaultBaseClass = base_type.FullName,  
  12.                              DefaultClassName = class_name,  
  13.                              DefaultNamespace = "YourNameSpace.dynamic",  
  14.                              GeneratedClassContext =  
  15.                                  new GeneratedClassContext("Execute", "Write", "WriteLiteral", "WriteTo",  
  16.                                                            "WriteLiteralTo",  
  17.                                                            "YourNameSpace.TemplateBase")  
  18.    
  19.                          };  
  20.           host.NamespaceImports.Add("System");  
  21.           host.NamespaceImports.Add("YourNameSpaces");  
  22.              
  23.           //生成代碼  
  24.           CodeCompileUnit code;  
  25.           using (var reader = new StringReader(template)) {  
  26.               var generatedCode = new RazorTemplateEngine(host).GenerateCode(reader);  
  27.               code = generatedCode.GeneratedCode;  
  28.           }  
  29.           //準(zhǔn)備編譯參數(shù)  
  30.           var @params = new CompilerParameters  
  31.           {  
  32.               IncludeDebugInformation = false,  
  33.               TempFiles = new TempFileCollection(AppDomain.CurrentDomain.DynamicDirectory),  
  34.               CompilerOptions = "/target:library /optimize",  
  35.               GenerateInMemory = false 
  36.           };  
  37.    
  38.           var assemblies = AppDomain.CurrentDomain  
  39.              .GetAssemblies()  
  40.              .Where(a => !a.IsDynamic)  
  41.              .Select(a => a.Location)  
  42.              .ToArray();  
  43.           @params.ReferencedAssemblies.AddRange(assemblies);  
  44.    
  45.           //編譯  
  46.           var provider = new CSharpCodeProvider();  
  47.           var compiled = provider.CompileAssemblyFromDom(@params, code);  
  48.    
  49.           if (compiled.Errors.Count > 0) {  
  50.               var compileErrors = string.Join("\r\n", compiled.Errors.Cast().Select(o => o.ToString()));  
  51.               throw new ApplicationException("Failed to compile Razor:" + compileErrors);  
  52.           }  
  53.    
  54.           //編譯成功后, 返回編譯后的動(dòng)態(tài)Type  
  55.           return compiled.CompiledAssembly.GetType("Skight.Arch.Presentation.Web.Core.ViewEngins.Razor.dynamic." + class_name);  
  56.    
  57.    
  58.       } 
  59. 第二步就簡(jiǎn)單多了,就和任何靜態(tài)類一樣,用反射創(chuàng)建實(shí)例,然后復(fù)制Model對(duì)象執(zhí)行模板,最后輸出結(jié)果是,就自動(dòng)吧Model類的數(shù)據(jù)嵌入了。

     
     
     
    1. public static string Render(T model,string template_path)  
    2.       {  
    3.           var type = Compile(template_path);  
    4.           //創(chuàng)建視圖實(shí)例  
    5.           var instance = (TemplateBase)Activator.CreateInstance(type);  
    6.    
    7.           //執(zhí)行模板(把數(shù)據(jù)嵌入文件)  
    8.           instance.Model = model;  
    9.           instance.Execute();  
    10.           //輸出最終結(jié)果  
    11.           var result = instance.Result;  
    12.    
    13.           return result;  
    14.       } 

    最后,看看視圖模板類,一個(gè)基類和一個(gè)泛型基類,后者用于前類型Model

     
     
     
    1. public abstract class TemplateBase  
    2.     {  
    3.         public string Layout { get; set; }  
    4.         public UrlHelper Url { get; set; }  
    5.         public Func RenderBody { get; set; }  
    6.         public string Path { get; internal set; }  
    7.         public string Result { get { return Writer.ToString(); } }  
    8.    
    9.         protected TemplateBase()  
    10.         {  
    11.         }  
    12.    
    13.         public TextWriter Writer  
    14.         {  
    15.             get 
    16.             {  
    17.                 if(writer==null)  
    18.                 {writer = new StringWriter();  
    19.                 }  
    20.                 return writer;  
    21.             }  
    22.             set {  
    23.                 writer = value;  
    24.             }  
    25.         }  
    26.    
    27.         private TextWriter writer;  
    28.    
    29.         public void Clear() {  
    30.            Writer.Flush();  
    31.         }  
    32.    
    33.         public virtual void Execute() { }  
    34.    
    35.         public void Write(object @object) {  
    36.             if (@object == null) {  
    37.                 return;  
    38.             }  
    39.             Writer.Write(@object);  
    40.         }  
    41.    
    42.         public void WriteLiteral(string @string) {  
    43.             if (@string == null) {  
    44.                 return;  
    45.             }  
    46.             Writer.Write(@string);  
    47.         }  
    48.    
    49.         public static void WriteLiteralTo(TextWriter writer, string literal) {  
    50.             if (literal == null) {  
    51.                 return;  
    52.             }  
    53.             writer.Write(literal);  
    54.         }  
    55.    
    56.         public static void WriteTo(TextWriter writer, object obj) {  
    57.             if (obj == null) {  
    58.                 return;  
    59.             }  
    60.             writer.Write(obj);  
    61.         }  
    62.     }  
    63.     public abstract class TemplateBase :TemplateBase  
    64.     {  
    65.         public T Model { get; set; }              
    66.     } 

    原文鏈接:http://www.cnblogs.com/Wonner/archive/2012/03/12/2391212.html


    當(dāng)前題目:逃脫Asp.NetMVC框架枷鎖使用Razor視圖引擎
    當(dāng)前地址:http://www.dlmjj.cn/article/cdsijhg.html