2015-02-19 17 views
44

Jakiś czas temu renderowania szablon korzystając RazorEngine było tak proste, jak:Templating użyciu nowego RazorEngine API

string s = RazorEngine.Razor.Parse() 

Jednak z jakiegoś powodu, jego autorzy zmienili zdanie o API i obecnie najprostszy sposób renderowania szablon jest:

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

(przynajmniej to co wywnioskowałem z nowego API Old jeden jest oznaczony jako przestarzałe.). Czy istnieje sposób na wykorzystanie nowego API do renderowania szablonu bez buforowania, kluczy i innych fantazyjnych rzeczy? Wszystko official examples po prostu nie działa.

+10

I druga opinia. Przykłady są bezużyteczne i nie mógłbym po prostu użyć przestarzałych metod, ponieważ teraz metoda RazorEngine.Templating.RazorEngineService.GetCompiledTemplate podaje mi błąd "Brak szablonu z kluczem ..." Aktualizacja jest zbyt skomplikowana i bolesne: dlaczego mamy używać pamięci podręcznej i klucza szablonu? Rozwinąłem projekt i staram się, aby mój stary kod działał z nową wersją ... – JJP

+2

Pamiętaj, aby umieścić: "using RazorEngine;" i "używając RazorEngine.Templating;" u góry, w przeciwnym razie przykłady nie będą działać. – ooXei1sh

Odpowiedz

57

Cóż, po wyszukaniu kodu, znalazłem kilka przydatnych przykładów (https://github.com/Antaris/RazorEngine/blob/master/src/source/RazorEngine.Hosts.Console/Program.cs) i okazało się, że jeśli to

using RazorEngine.Templating; 

na szczycie swojej klasy, można korzystać z niektórych metod rozszerzenie (https://github.com/Antaris/RazorEngine/blob/master/src/source/RazorEngine.Core/Templating/RazorEngineServiceExtensions.cs), które pomoże Ci.

Bezbolesne szablon kompilacja:

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

Szablon analizowaniem:

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

I teraz można zrobić zarówno w tym samym czasie!

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

który jest równowartość robi to

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

Należy pamiętać, że jestem obecnie testuje tego, ale wydaje się działać prawidłowo.

+6

Czy masz pomysł, jak usunąć skompilowany szablon z pamięci podręcznej? –

+0

Wygląda na to, że musisz utworzyć nową instancję dostawcy pamięci podręcznej, zobacz ten link: http://stackoverflow.com/questions/14369614/razorengine-un-cache-compiled-templates – JJP

+3

Nie mogę znaleźć TemplateLoader – bublegumm

2

Poniższy kod działa dla ResolvePathTemplateManager(październik, 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); 

Źródło: w RazorEngineServiceTestFixture.cs, poszukaj ResolvePathTemplateManager.

+1

Potwierdzone, to podejście działa. Wielkie dzięki. – JGreasley

Powiązane problemy