Templating using new RazorEngine API

2019-01-21 08:02发布

问题:

Some time ago rendering a template using RazorEngine was as easy as:

string s = RazorEngine.Razor.Parse()

However, for some reason, its authors changed their minds about the API and now the simplest way to render a template is:

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

(at least this is what I deduced from the new API. Old one is marked as deprecated.) Is there a way to use new API to render a template without caching, keys and other fancy stuff? All official examples simply doesn't work.

回答1:

Well, after searching the code, I found some useful examples (https://github.com/Antaris/RazorEngine/blob/master/src/source/RazorEngine.Hosts.Console/Program.cs) and found out that if you include

using RazorEngine.Templating;

at the top of your class, you can use some extension methods (https://github.com/Antaris/RazorEngine/blob/master/src/source/RazorEngine.Core/Templating/RazorEngineServiceExtensions.cs) that will help you.

Painless template compilation :

Engine.Razor.Compile(templatePath, "templateNameInTheCache", modelType);

Template Parsing :

Engine.Razor.Run("templateNameInTheCache", modelType, model);

And now you can do both at the same time !

string myParsedTemplate = Engine.Razor.RunCompile(templatePath, "templateNameInTheCache", null, model)

Which is the equivalent of doing this

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

Please note that I'm currently testing this, but it seems to work fine.



回答2:

The following code works for ResolvePathTemplateManager (October, 2017):

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

Source: in RazorEngineServiceTestFixture.cs, look for ResolvePathTemplateManager.



回答3:

Building on @turdus-merula's answer, I wanted the temp files to be cleaned up when the default AppDomain is unloaded. I disabled the temp file locking in the config, which allows the temp folder to be deleted.

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


标签: c# razor