这篇文章将为大家详细讲解有关如何使用Razor视图引擎名,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。
首先,用到的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;} }
关于“如何使用Razor视图引擎名”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。