Шаблоны с использованием нового API RazorEngine

Некоторое время назад создание шаблона с помощью 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 для визуализации шаблона без кеширования, ключей и других причудливых вещей? Все официальные примеры просто не работают.

Ответ 1

Ну, после поиска кода я нашел несколько полезных примеров (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);

Разбор шаблонов:

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

Обратите внимание, что я сейчас тестирую это, но, похоже, он работает нормально.

Ответ 2

Следующий код работает для ResolvePathTemplateManager (октябрь 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);

Источник: в RazorEngineServiceTestFixture.cs, найдите ResolvePathTemplateManager.