使用新的RazorEngine API进行模板化

Spo*_*ook 56 c# razor

前一段时间渲染模板RazorEngine就像以下一样简单:

string s = RazorEngine.Razor.Parse()
Run Code Online (Sandbox Code Playgroud)

但是,出于某种原因,它的作者改变了对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();
Run Code Online (Sandbox Code Playgroud)

(至少这是我从新API中推断出来的.旧的标记为已弃用.)有没有办法使用新的API来渲染模板而不需要缓存,键和其他花哨的东西?所有官方的例子根本不起作用.

JJP*_*JJP 70

好吧,在搜索完代码后,我找到了一些有用的例子(https://github.com/Antaris/RazorEngine/blob/master/src/source/RazorEngine.Hosts.Console/Program.cs)并发现如果你包括

using RazorEngine.Templating;
Run Code Online (Sandbox Code Playgroud)

在您的课程顶部,您可以使用一些可以帮助您的扩展方法(https://github.com/Antaris/RazorEngine/blob/master/src/source/RazorEngine.Core/Templating/RazorEngineServiceExtensions.cs).

无痛模板编译:

Engine.Razor.Compile(templatePath, "templateNameInTheCache", modelType);
Run Code Online (Sandbox Code Playgroud)

模板解析:

Engine.Razor.Run("templateNameInTheCache", modelType, model);
Run Code Online (Sandbox Code Playgroud)

现在你可以同时做两件事!

string myParsedTemplate = Engine.Razor.RunCompile(templatePath, "templateNameInTheCache", null, model)
Run Code Online (Sandbox Code Playgroud)

这相当于这样做

Engine.Razor.AddTemplate("templateNameInTheCache", TemplateLoader.GetTemplate(templatePath));
Engine.Razor.Compile("templateNameInTheCache", modelType);
string finallyThisIsMyParsedTemplate = Engine.Razor.Run("templateNameInTheCache", modelType);
Run Code Online (Sandbox Code Playgroud)

请注意,我正在测试这个,但似乎工作正常.

  • 知道如何从缓存中删除已编译的模板吗? (7认同)
  • @JJP你确定`Engine.Razor.Compile(templatePath,"templateNameInTheCache",modelType); `有效吗?查看他们的代码,看起来该方法需要模板字符串而不是模板的路径.您提供的代码对我不起作用,它为我提供了已解析的服务器路径作为模板.谢谢. (4认同)
  • 我找不到TemplateLoader (3认同)
  • @Justin,别忘了使用File.ReadAllText(HostingEnvironment.MapPath("YourView.cshtml")) (3认同)
  • @ user2023116感谢您的帮助.很遗憾你需要深入挖掘这个工作实例.对于这个库中的这种重大变化,大拇指向下 (3认同)
  • 为什么他们强迫我们使用他们的缓存实现?如果我想缓存渲染的模板,我可以自己实现。请把`Parse` 方法还给我们 (2认同)

tur*_*ula 6

以下代码适用于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);
Run Code Online (Sandbox Code Playgroud)

来源:在RazorEngineServiceTestFixture.cs中,寻找ResolvePathTemplateManager.