C# 使用新的RazorEngine API进行模板化

C# 使用新的RazorEngine API进行模板化,c#,razor,C#,Razor,不久前,使用RazorEngine渲染模板非常简单: string s = RazorEngine.Razor.Parse() 然而,出于某种原因,其作者改变了对API的看法,现在呈现模板的最简单方法是: var key = new RazorEngine.Templating.NameOnlyTemplateKey("EmailTemplate", RazorEngine.Templating.ResolveType.Global, null); RazorEngine.Engine.Raz

不久前,使用
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();

(至少这是我从新的API中推断出来的。旧的API被标记为已弃用。)有没有一种方法可以使用新的API来呈现模板,而无需缓存、密钥和其他花哨的东西?所有这些都不起作用。

好吧,在搜索代码之后,我找到了一些有用的示例(),并发现如果您包括

using RazorEngine.Templating;
在类的顶部,可以使用一些扩展方法()来帮助您

无痛模板编译:

Engine.Razor.Compile(templatePath, "templateNameInTheCache", modelType);
模板解析:

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);

请注意,我目前正在测试它,但它似乎工作正常。

以下代码适用于
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);

来源:在中,查找
ResolvePathTemplateManager

基于@turdus merula的回答,我希望在卸载默认AppDomain时清理临时文件。我在配置中禁用了临时文件锁定,这允许删除临时文件夹

var config = new TemplateServiceConfiguration
{
    TemplateManager = new ResolvePathTemplateManager(new[] {"EmailTemplates"}),
    DisableTempFileLocking = true
};

Engine.Razor = RazorEngineService.Create(config);

var html = Engine.Razor.RunCompile("Test.cshtml", null, model);

仅供参考,使用RazorEngine API会导致内存泄漏。据报道,有一个官方问题是,编译模板会不断生成很难删除的临时文件。所以,如果你在生产中使用它,一定要非常小心


上次我使用它时,每次编译模板时,它都会不断向内存中添加+1MB,即使使用缓存模板也是如此

我同意这个意见。这些示例是无用的,我不能只使用不推荐的方法,因为现在方法RazorEngine.Templating.RazorEngineService.GetCompiledTemplate不断给我错误“没有带密钥的模板…”升级太复杂和痛苦:为什么我们要使用缓存和模板密钥?我已经完成了这个项目,正在尝试让我的旧代码与新版本一起工作……请确保在顶部写上:“使用RazorEngine;”和“使用RazorEngine.Templating;”,否则示例将无法工作。你知道如何从缓存中删除编译后的模板吗?我找不到TemplateLoader@JJP你确定
Engine.Razor.Compile吗(templatePath,“TemplateNameInCache”,modelType);
有效?通过查看它们的代码,该方法似乎需要模板字符串,而不是模板的路径。您提供的代码不适用于我,它将解析的服务器路径作为模板提供给我。谢谢。@Justin,别忘了使用File.ReadAllText(HostingEnvironment.MapPath(“YourView.cshtml”)@user2023116感谢您的帮助。很遗憾,您需要深入挖掘才能拼凑出一个有效的示例。对于这个库中如此突破性的更改,我深表歉意