当前位置: 网学 > 编程文档 > 其他类别 > 正文

逃脱Asp.Net MVC框架枷锁 使用Razor视图引擎

来源:Http://myeducs.cn 联系QQ:点击这里给我发消息 作者: 用户投稿 来源: 网络 发布时间: 13/01/12

此文应该算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.       } 

网学推荐

免费论文

原创论文

浏览:
设为首页 | 加入收藏 | 论文首页 | 论文专题 | 设计下载 | 网学软件 | 论文模板 | 论文资源 | 程序设计 | 关于网学 | 站内搜索 | 网学留言 | 友情链接 | 资料中心
版权所有 QQ:3710167 邮箱:3710167@qq.com 网学网 [Myeducs.cn] 您电脑的分辨率是 像素
Copyright 2008-2015 myeducs.Cn www.myeducs.Cn All Rights Reserved
湘ICP备09003080号