您好,登錄后才能下訂單哦!
這篇文章將為大家詳細(xì)講解有關(guān)如何使用Razor視圖引擎名,小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。
首先,用到的Razor域名空間。
usingSystem.Web.Razor; usingSystem.Web.Razor.Generator; usingSystem.Web.Razor.Parser;
第一步,動(dòng)態(tài)編譯:解析視圖文件,生成代碼,是的,生成代碼,先。Razor的語(yǔ)法可以說是私有語(yǔ)法,需要先生成標(biāo)準(zhǔn)代碼,然后才編譯,生成我們熟悉的C#類Type。需要注意的是,我下面代碼用的模板基類是我自己的TeamplateBase,后面會(huì)給出簡(jiǎn)單實(shí)現(xiàn),當(dāng)然,好處就是靈活性。你也可以直接用Asp.NetMVC的System.Web.Mvc.WebViewPage,不過我沒有試過,也許會(huì)有其他問題,不能保證。
publicstaticTypeCompile(stringtemplate_path) { //準(zhǔn)備臨時(shí)類名,讀取模板文件和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; } //準(zhǔn)備編譯參數(shù) 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); } //編譯成功后,返回編譯后的動(dòng)態(tài)Type returncompiled.CompiledAssembly.GetType("Skight.Arch.Presentation.Web.Core .ViewEngins.Razor.dynamic."+class_name); }
怎樣使用Razor視圖引擎名
第二步就簡(jiǎn)單多了,就和任何靜態(tài)類一樣,用反射創(chuàng)建實(shí)例,然后復(fù)制Model對(duì)象執(zhí)行模板,最后輸出結(jié)果是,就自動(dòng)吧Model類的數(shù)據(jù)嵌入了。
publicstaticstringRender(Tmodel,stringtemplate_path) { vartype=Compile(template_path); //創(chuàng)建視圖實(shí)例 varinstance=(TemplateBase)Activator.CreateInstance(type); //執(zhí)行模板(把數(shù)據(jù)嵌入文件) instance.Model=model; instance.Execute(); //輸出最終結(jié)果 varresult=instance.Result; returnresult; }
最后,看看視圖模板類,一個(gè)基類和一個(gè)泛型基類,后者用于前類型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;} }
關(guān)于“如何使用Razor視圖引擎名”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,使各位可以學(xué)到更多知識(shí),如果覺得文章不錯(cuò),請(qǐng)把它分享出去讓更多的人看到。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。