使用新的RazorEngine API进行模板化
前段时间,使用RazorEngine
渲染模板非常简单:
string s = RazorEngine.Razor.Parse()
然而,由于某种原因,其作者改变了关于API的思想,现在渲染模板的最简单的方法是:
var key = new RazorEngine.Templating.NameOnlyTemplateKey("EmailTemplate", RazorEngine.Templating.ResolveType.Global, null); RazorEngine.Engine.Razor.AddTemplate(key, new RazorEngine.Templating.LoadedTemplateSource("Ala ma kota")); StringBuilder sb = new StringBuilder(); StringWriter sw = new StringWriter(sb); RazorEngine.Engine.Razor.RunCompile(key, sw); string s = sb.ToString();
(至less这是我从新的API中推导出来的,旧的被标记为已弃用)有没有一种方法可以使用新的API来渲染模板,而不需要caching,键和其他花哨的东西? 所有官方的例子根本不起作用。
那么,在search代码之后,我发现了一些有用的例子( https://github.com/Antaris/RazorEngine/blob/master/src/source/RazorEngine.Hosts.Console/Program.cs ),发现如果包含
using RazorEngine.Templating;
在你的课程顶部,你可以使用一些扩展方法( https://github.com/Antaris/RazorEngine/blob/master/src/source/RazorEngine.Core/Templating/RazorEngineServiceExtensions.cs )来帮助你。
无痛模板编译:
Engine.Razor.Compile(templatePath, "templateNameInTheCache", modelType);
模板parsing:
Engine.Razor.Run("templateNameInTheCache", modelType, model);
现在你可以同时做两个!
string myParsedTemplate = Engine.Razor.RunCompile(templatePath, "templateNameInTheCache", null, model)
这相当于这样做
Engine.Razor.AddTemplate("templateNameInTheCache", TemplateLoader.GetTemplate(templatePath)); Engine.Razor.Compile("templateNameInTheCache", modelType); string finallyThisIsMyParsedTemplate = Engine.Razor.Run("templateNameInTheCache", modelType);
请注意,我目前正在testing这个,但它似乎工作正常。
以下代码适用于ResolvePathTemplateManager
(2017年10月) :
var templateManager = new ResolvePathTemplateManager(new[] { rootPath }); var config = new TemplateServiceConfiguration { TemplateManager = templateManager }; Engine.Razor = RazorEngineService.Create(config); // ... var html = Engine.Razor.RunCompile("Test.cshtml", null, model);
来源:在RazorEngineServiceTestFixture.cs中 ,查找ResolvePathTemplateManager
。