国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

逃脫Asp.Net MVC框架枷鎖 使用Razor視圖引擎

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

此文應該算Razor引擎淺析的續篇,或者說淺析是此文的前傳。

為什么要這么做?

1. Asp.Net MVC 其實也不是太好

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

3. 動態編譯很有意思,這也是將來的一個趨勢,如果有人有興趣,我倒是很想寫寫這方面的內容.

可是也有這些想法的人并不多,找來找去,這方面的資料和論述極其之少。與其臨淵羨魚,不如退而結網。自己動手,豐衣足食。

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

保持模板功能,特別是設計時智能語法支持,很簡單,創建項目時選擇MVC項目,然后把其它MVC相關的引用刪掉只剩下Razor就好了。

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

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

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

第一步,動態編譯:解析視圖文件,生成代碼,是的,生成代碼,先。Razor的語法可以說是私有語法,需要先生成標準代碼,然后才編譯,生成我們熟悉的C#類Type。需要注意的是,我下面代碼用的模板基類是我自己的TeamplateBase,后面會給出簡單實現,當然,好處就是靈活性。你也可以直接用Asp.Net MVC的System.Web.Mvc.WebViewPage, 不過我沒有試過,也許會有其他問題,不能保證。

  1. public static Type Compile<T>(string template_path)  
  2.       {  
  3.           //準備臨時類名,讀取模板文件和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.           //準備編譯參數  
  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<object>().Select(o => o.ToString()));  
  51.               throw new ApplicationException("Failed to compile Razor:" + compileErrors);  
  52.           }  
  53.    
  54.           //編譯成功后, 返回編譯后的動態Type  
  55.           return compiled.CompiledAssembly.GetType("Skight.Arch.Presentation.Web.Core.ViewEngins.Razor.dynamic." + class_name);  
  56.    
  57.    
  58.       } 

第二步就簡單多了,就和任何靜態類一樣,用反射創建實例,然后復制Model對象執行模板,最后輸出結果是,就自動吧Model類的數據嵌入了。

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

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

  1. public abstract class TemplateBase  
  2.     {  
  3.         public string Layout { getset; }  
  4.         public UrlHelper Url { getset; }  
  5.         public Func<string> RenderBody { getset; }  
  6.         public string Path { getinternal 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<T> :TemplateBase  
  64.     {  
  65.         public T Model { getset; }              
  66.     } 

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

責任編輯:林師授 來源: 博客園
相關推薦

2021-06-22 16:59:56

微軟.NETC# 軟件開發

2011-01-19 11:17:36

2009-07-24 13:20:44

MVC框架ASP.NET

2012-05-09 13:29:42

ASP.NET

2009-07-20 10:53:59

ASP.NET MVC

2009-07-22 13:24:24

ASP.NET MVC

2009-07-22 10:09:59

ASP.NET MVC

2010-12-07 09:38:15

ASP.NET MVC

2009-07-22 13:08:55

拯救UpdatePanASP.NET MVC

2009-07-22 10:34:37

ActionInvokASP.NET MVC

2009-07-23 15:44:39

ASP.NET MVC

2010-06-23 15:44:03

ASP.NET MVC

2009-07-28 13:06:45

ASP.NET MVC

2014-06-30 09:22:38

ASP.NETBootstrap

2009-03-13 10:58:48

ASP.NetMVC框架編程

2009-07-31 12:43:59

ASP.NET MVC

2009-07-20 12:59:53

ASP.NET MVCASP.NET框架的功

2009-07-24 10:55:00

asp.net mvc

2009-06-01 10:23:31

asp.net mvcasp.net mvc.net mvc框架

2009-07-20 15:51:40

FubuMVC核心框架ASP.NET MVC
點贊
收藏

51CTO技術棧公眾號

91亚洲人电影| 福利av痴女| 亚洲丶国产丶欧美一区二区三区| 澳门成人av| 日本一区二区三区电影| 精品综合久久久| 欧美四级电影在线观看| 精品亚洲国内自在自线福利| 精品人人人人| 欧美美乳在线| 欧美成人精品免费| 亚洲综合小说区| 欧美区在线播放| 欧美视频在线观看 亚洲欧| 久久99精品久久久久久| 日韩精品一区二区久久| 免费h在线看| 免费福利在线观看| 理论视频在线| 国产裸体舞一区二区三区| 一卡二卡欧美日韩| 国产成人av电影免费在线观看| 欧美色综合网| 国产日产一区| 欧美大片网址| 国产美女精品视频免费播放软件| 深夜av在线| 免费a级毛片在线播放| av在线电影播放| 久久bbxx| 岛国中文字幕在线| av小说在线播放| 祥仔av免费一区二区三区四区| h网站视频在线观看| 夜色福利资源站www国产在线视频 夜色资源站国产www在线视频 | 日韩一区二区在线看| 精品少妇一区二区三区在线视频| 久久久久久亚洲精品不卡| 97在线免费视频观看| 三上悠亚亚洲一区| 日本不卡一区二区| 色999日韩| 久久久久国产精品免费免费搜索| 伊人av综合网| 久久综合久久色| 久久男人av| 久久久精品免费网站| 中文字幕亚洲一区二区三区五十路| 欧美性受黑人性爽| 粉嫩av国产一区二区三区| 激情图片小说一区| 五月天一区二区三区| 亚洲激情中文字幕| 三级精品视频久久久久| 亚洲精品美女在线观看播放| 久久精品夜色噜噜亚洲aⅴ| 天天综合天天做天天综合| 成年无码av片在线| 欧美精品中文字幕一区二区| 午夜久久久精品| www.豆豆成人网.com| 国产精品18久久久久久久久| 欧美日韩一区二区三区| 免费国产在线精品一区二区三区| 蜜臀av免费观看| 亚洲www免费| 丝袜美腿亚洲综合| 亚洲成人网在线| 久久国产欧美精品| 成人午夜电影在线观看| 91久久在线| 免费看国产黄色片| 欧美一级黄色片视频| 尤物国产在线观看| 最近中文字幕mv免费高清在线| 国产一级大片免费看| 熟女少妇精品一区二区| 精产国产伦理一二三区| 中文字幕色婷婷在线视频| 国产福利一区二区三区在线播放| 天堂精品在线视频| 欧美+日本+国产+在线a∨观看| 亚洲欧美一级二级三级| 男人的天堂久久精品| 一区二区三区在线观看视频| 欧美高清激情brazzers| 日日噜噜噜夜夜爽亚洲精品| 日韩一区二区欧美| 国产美女在线精品免费观看| 全部孕妇毛片丰满孕妇孕| 在线观看精品一区二区三区| 97成人资源| 国产色综合网| 欧美丝袜自拍制服另类| 欧美视频免费在线观看| 亚洲国产小视频| 5566av亚洲| 全部a∨一极品视觉盛宴| 狠狠综合久久av一区二区蜜桃| 久久免费精品国产久精品久久久久| 亚洲精品wwwww| 国产毛片av在线| 一区二区三区四区亚洲| 2025韩国大尺度电影| 国产美女在线观看| 黄色日韩网站视频| 亚洲最大福利视频网| 久久久一本精品99久久精品| 91亚洲精品视频在线观看| 91精品国产欧美一区二区18| 中文综合在线观看| 日韩av综合在线观看| 北条麻妃在线一区二区免费播放| 久久久精品五月天| 欧美亚洲动漫制服丝袜| 欧美日韩中文在线视频| 亚洲精品aaa| 久久久久久女乱国产| 国产成人欧美日韩在线电影| 在线观看免费视频一区二区三区| 亚洲一卡二卡三卡四卡无卡久久| 瑟瑟在线观看| 欧美久久久久免费| 竹内纱里奈兽皇系列在线观看| 亚洲一二三区在线观看| 99爱视频在线| 综合激情婷婷| 久久久福利视频| 美女诱惑黄网站一区| 亚洲欧美日韩精品在线| 国产一级精品在线| 国产高清精品一区| 麻豆精品一区二区| 亚洲视频第二页| 亚洲日本在线观看| xx免费视频| 韩国v欧美v日本v亚洲v| 性欧美大战久久久久久久| av影片在线一区| 66m—66摸成人免费视频| 天堂网在线最新版www中文网| 91精品国产一区二区三区蜜臀| 老太脱裤让老头玩ⅹxxxx| 99欧美精品| 91精品1区2区| 中文在线а天堂av| 国产精品嫩草影院av蜜臀| 奇米777四色影视在线看| 91九色美女在线视频| 国产成人在线免费| 精品午夜一区二区三区| 亚洲精品一区av| 性欧美videos另类喷潮| 日韩美女中文字幕| jizz欧美| 亚洲成年人在线| 欧美少妇一级片| 亚洲一区日本| 91美女片黄在线观| 日韩大片在线观看| 久久精品国产亚洲精品| 一区二区三区在线资源| 国产a∨精品一区二区三区不卡| av在线不卡精品| 欧美性欧美巨大黑白大战| 不卡av免费观看| 国产调教视频一区| 国产青草视频在线观看| 日一区二区三区| 久久久久无码国产精品一区| 羞羞答答成人影院www| 国产精品久久久久久久久影视| 在线视频亚洲欧美中文| 久久精品中文字幕电影| 国产成人一二片| 狠狠综合久久av一区二区小说| 午夜爽爽视频| 91精品国产综合久久香蕉的特点 | 91网页在线观看| 日韩精品一区二区三区三区免费 | 亚州av一区| 91高清视频免费| 欧美精品二区| 欧美日韩免费高清| www.亚洲人| 性xxxfreexxxx性欧美| 亚洲高清一二三区| 成人午夜一级| 久久久噜噜噜久噜久久| 国产精品免费99久久久| 亚洲精品一区二| 成人ar影院免费观看视频| 波多野结衣 作品| 国产精品久久久久9999吃药| 国产成人精品视频在线| 亚洲91中文字幕无线码三区| 午夜啪啪免费视频| 26uuu精品一区二区| 色琪琪原网站亚洲香蕉| 91久久精品网|