Il y a quelque temps, le rendu d'un modèle avec RazorEngine
était aussi simple que:
string s = RazorEngine.Razor.Parse()
Cependant, pour une raison quelconque, ses auteurs ont changé d'avis sur l'API et le moyen le plus simple de générer un modèle consiste désormais à:
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();
(C'est du moins ce que j'ai déduit de la nouvelle API. L'ancienne est marquée comme obsolète.) Existe-t-il un moyen d'utiliser la nouvelle API pour restituer un modèle sans mise en cache, clés ni autres éléments de fantaisie? Tous les exemples officiels ne fonctionnent tout simplement pas.
Après avoir recherché le code, j’ai trouvé quelques exemples utiles ( https://github.com/Antaris/RazorEngine/blob/master/src/source/RazorEngine.Hosts.Console/Program.cs ) et a découvert que si vous incluez
using RazorEngine.Templating;
au sommet de votre classe, vous pouvez utiliser certaines méthodes d’extension ( https://github.com/Antaris/RazorEngine/blob/master/src/source/RazorEngine.Core/Templating/RazorEngineServiceExtensions.cs ) qui vous aidera.
Compilation de modèles sans douleur:
Engine.Razor.Compile(templatePath, "templateNameInTheCache", modelType);
Analyse de modèle:
Engine.Razor.Run("templateNameInTheCache", modelType, model);
Et maintenant, vous pouvez faire les deux en même temps!
string myParsedTemplate = Engine.Razor.RunCompile(templatePath, "templateNameInTheCache", null, model)
Quel est l'équivalent de faire cela
Engine.Razor.AddTemplate("templateNameInTheCache", TemplateLoader.GetTemplate(templatePath));
Engine.Razor.Compile("templateNameInTheCache", modelType);
string finallyThisIsMyParsedTemplate = Engine.Razor.Run("templateNameInTheCache", modelType);
S'il vous plaît noter que je teste actuellement cela, mais cela semble bien fonctionner.
Le code suivant fonctionne pour ResolvePathTemplateManager
(octobre 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: dans RazorEngineServiceTestFixture.cs , recherchez ResolvePathTemplateManager
.
En me basant sur la réponse de @ turdus-merula, je souhaitais que les fichiers temporaires soient nettoyés lorsque le AppDomain par défaut est déchargé. J'ai désactivé le verrouillage du fichier temporaire dans la configuration, ce qui permet de supprimer le dossier temporaire.
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);