您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關如何使用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進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。