Шаблоны с использованием нового 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
.