溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

如何使用Razor視圖引擎名

發(fā)布時(shí)間:2021-09-23 14:43:44 來源:億速云 閱讀:116 作者:小新 欄目:編程語(yǔ)言

這篇文章將為大家詳細(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)把它分享出去讓更多的人看到。

向AI問一下細(xì)節(jié)

免責(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)容。

AI