這篇文章將為大家詳細(xì)講解有關(guān)如何使用Razor視圖引擎名,小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。

首先,用到的Razor域名空間。
usingSystem.Web.Razor; usingSystem.Web.Razor.Generator; usingSystem.Web.Razor.Parser;
第一步,動(dòng)態(tài)編譯:解析視圖文件,生成代碼,是的,生成代碼,先。Razor的語(yǔ)法可以說(shuō)是私有語(yǔ)法,需要先生成標(biāo)準(zhǔn)代碼,然后才編譯,生成我們熟悉的C#類(lèi)Type。需要注意的是,我下面代碼用的模板基類(lèi)是我自己的TeamplateBase,后面會(huì)給出簡(jiǎn)單實(shí)現(xiàn),當(dāng)然,好處就是靈活性。你也可以直接用Asp.NetMVC的System.Web.Mvc.WebViewPage,不過(guò)我沒(méi)有試過(guò),也許會(huì)有其他問(wèn)題,不能保證。
publicstaticTypeCompile(stringtemplate_path) { //準(zhǔn)備臨時(shí)類(lèi)名,讀取模板文件和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)類(lèi)一樣,用反射創(chuàng)建實(shí)例,然后復(fù)制Model對(duì)象執(zhí)行模板,最后輸出結(jié)果是,就自動(dòng)吧Model類(lèi)的數(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; }最后,看看視圖模板類(lèi),一個(gè)基類(lèi)和一個(gè)泛型基類(lèi),后者用于前類(lèi)型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í),如果覺(jué)得文章不錯(cuò),請(qǐng)把它分享出去讓更多的人看到。
文章名稱(chēng):如何使用Razor視圖引擎名-創(chuàng)新互聯(lián)
本文鏈接:http://www.yijiale78.com/article14/dehede.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站改版、小程序開(kāi)發(fā)、微信小程序、全網(wǎng)營(yíng)銷(xiāo)推廣、網(wǎng)站設(shè)計(jì)、建站公司
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容