如何使用Razor视图引擎名
创始人
2024-12-19 01:44:03
0次

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

usingSystem.Web.Razor;   usingSystem.Web.Razor.Generator;   usingSystem.Web.Razor.Parser;

第一步,动态编译:解析视图文件,生成代码,是的,生成代码,先。Razor的语法可以说是私有语法,需要先生成标准代码,然后才编译,生成我们熟悉的C#类Type。需要注意的是,我下面代码用的模板基类是我自己的TeamplateBase,后面会给出简单实现,当然,好处就是灵活性。你也可以直接用Asp.NetMVC的System.Web.Mvc.WebViewPage,不过我没有试过,也许会有其他问题,不能保证。

publicstaticTypeCompile(stringtemplate_path)   {   //准备临时类名,读取模板文件和Razor代码生成器   varclass_name="c"+Guid.NewGuid().ToString("N");   varbase_type=typeof(TemplateBase<>).MakeGenericType(typeof(T));   vartemplate=File.ReadAllText(template_path);   varhost=newRazorEngineHost(newCSharpRazorCodeLanguage(),()=>   newHtmlMarkupParser())   {   DefaultBaseClass=base_type.FullName,   DefaultClassName=class_name,   DefaultNamespace="YourNameSpace.dynamic",   GeneratedClassContext=   newGeneratedClassContext("Execute","Write",   "WriteLiteral","WriteTo",   "WriteLiteralTo",   "YourNameSpace.TemplateBase")   };   host.NamespaceImports.Add("System");   host.NamespaceImports.Add("YourNameSpaces");   //生成代码   CodeCompileUnitcode;   using(varreader=newStringReader(template)){   vargeneratedCode=newRazorTemplateEngine(host).GenerateCode(reader);   code=generatedCode.GeneratedCode;   }   //准备编译参数   var@params=newCompilerParameters   {   IncludeDebugInformation=false,   TempFiles=newTempFileCollection(AppDomain.CurrentDomain   .DynamicDirectory),   CompilerOptions="/target:library/optimize",   GenerateInMemory=false   };   varassemblies=AppDomain.CurrentDomain   .GetAssemblies()   .Where(a=>!a.IsDynamic)   .Select(a=>a.Location)   .ToArray();   @params.ReferencedAssemblies.AddRange(assemblies);   //编译   varprovider=newCSharpCodeProvider();   varcompiled=provider.CompileAssemblyFromDom(@params,code);   if(compiled.Errors.Count>0){   varcompileErrors=string.Join("rn",compiled.Errors.Cast()   .Select(o=>o.ToString()));   thrownewApplicationException("FailedtocompileRazor:"+   compileErrors);   }   //编译成功后,返回编译后的动态Type   returncompiled.CompiledAssembly.GetType("Skight.Arch.Presentation.Web.Core   .ViewEngins.Razor.dynamic."+class_name);   }

怎样使用Razor视图引擎名

第二步就简单多了,就和任何静态类一样,用反射创建实例,然后复制Model对象执行模板,最后输出结果是,就自动吧Model类的数据嵌入了。

publicstaticstringRender(Tmodel,stringtemplate_path)   {   vartype=Compile(template_path);   //创建视图实例   varinstance=(TemplateBase)Activator.CreateInstance(type);   //执行模板(把数据嵌入文件)   instance.Model=model;   instance.Execute();   //输出最终结果   varresult=instance.Result;   returnresult;   }

最后,看看视图模板类,一个基类和一个泛型基类,后者用于前类型Model

publicabstractclassTemplateBase   {   publicstringLayout{get;set;}   publicUrlHelperUrl{get;set;}   publicFuncRenderBody{get;set;}   publicstringPath{get;internalset;}   publicstringResult{get{returnWriter.ToString();}}   protectedTemplateBase()   {   }   publicTextWriterWriter   {   get   {   if(writer==null)   {writer=newStringWriter();   }   returnwriter;   }   set{   writer=value;   }   }   privateTextWriterwriter;   publicvoidClear(){   Writer.Flush();   }   publicvirtualvoidExecute(){}   publicvoidWrite(object@object){   if(@object==null){   return;   }   Writer.Write(@object);   }   publicvoidWriteLiteral(string@string){   if(@string==null){   return;   }   Writer.Write(@string);   }   publicstaticvoidWriteLiteralTo(TextWriterwriter,stringliteral){   if(literal==null){   return;   }   writer.Write(literal);   }   publicstaticvoidWriteTo(TextWriterwriter,objectobj){   if(obj==null){   return;   }   writer.Write(obj);   }   }   publicabstractclassTemplateBase:TemplateBase   {   publicTModel{get;set;}   }

相关内容

热门资讯

空调连续工作多久需要停机休息 空调连续工作的时间取决于多个因素,包括空调的型号、功率、使用环境和维护情况等。一般来说,空调可以连续...
空调哪个符号是除湿的 空调除湿功能通常用一个水滴形状的符号表示。不同品牌和型号的空调遥控器可能会有所差异,但一般来说,除湿...
格力空调多长时间加一次氟利昂 1、一般情况下,空调对氟利昂的使用量是非常小的,所以在空调使用了四年左右的时候再考虑加也没问题。2、...
空调用多长时间需要加氟一次 一般情况下是五年。当出现以下这几种情况时,空调才需要加氟。1、空调的室内机和室外机各有两个接口,当接...
格调生活·C标思享荟:卡萨帝在... 9月12日的郑州龙湖金融岛,夜风轻拂,灯光璀璨。“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑...
品牌价值破千亿、高端份额持续领... 9月12日,“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑州站”在郑州龙湖金融岛举办。2026...
空调主板坏了修800还是换新的 空调主板坏了是修还是换新,需要考虑多个因素,以下是一些建议:1. 维修成本:如果维修费用较低,比如 ...
空调开多久需要休息多长时间 问题:空调开多久需要休息多长时间回答:1、在使用空调的过程中,一般空调开7~8个小时左右需要休息2~...
中央空调多长时间清洗一次 1、一般空调开机前清洗一次即可,空调开机中间时段再清洗一次,空调关机时清洗一次,这样比较合理。2、空...
中央空调氟利昂多久加一次 看空调制热和制冷程度,很多人的观点认为氟利昂必须一年放一次,其实这个观点是错误的,理解上面有点偏差,...