Ist es möglich, Razor View Engine außerhalb von asp.net zu verwenden?

102

Wenn ich mir die Razor View Engine anschaue, sehe ich eine sehr schöne und prägnante Syntax, die nicht besonders an die Generierung von HTML gebunden ist. Ich frage mich also, wie einfach es wäre, die Engine außerhalb von asp.net in einer "normalen" .net-Umgebung zu verwenden, um beispielsweise Text, Code, ... zu generieren.

Jeder Hinweis, jedes Beispiel, jeder Kommentar oder jede Erklärung ist willkommen.

Thomas
quelle

Antworten:

80

Hier gibt es zwei Probleme:

  1. Ja, Sie können die Razor View Engine außerhalb des Kontexts einer ASP.NET-App-Domäne ausführen, wie in Andrews Blog erläutert: http://vibrantcode.com/blog/2010/11/16/hosting-razor-outside-of -aspnet-überarbeitet-für-mvc3-rc.html
  2. Razor konzentriert sich jedoch nach wie vor hauptsächlich auf das Generieren von XML-ähnlichen Markups (z. B. HTML) in dem Sinne, dass der Razor-Parser das Vorhandensein von verwendet <tags>, um den Übergang zwischen Code und Markup zu bestimmen. Sie können es wahrscheinlich verwenden, um Text zu generieren, aber es kann zu Problemen kommen, wenn Ihre Ausgabe nicht den Annahmen von Razor über Ihre Absichten entspricht.

So zum Beispiel, während dies ein gültiger Razor-Code ist (wegen des <div>Tags):

@if(printHello) {
   <div>Hello!</div>
}

Das folgende Snippet ist ungültig (da das Hello! Immer noch als Code behandelt wird):

@if(printHello) {
   Hello!
}

Es gibt jedoch ein spezielles <text>Tag, mit dem ein Übergang für mehrzeilige Blöcke <text>erzwungen werden kann (das Tag wird nicht gerendert):

@if(printHello) {
   <text>Hello!
   Another line</text>
}

Es gibt auch eine kürzere Syntax, um eine einzelne Zeile zum Übergang zu zwingen, indem @::

@if(printHello) {
   @:Hello!
}
Marcind
quelle
2
Nun, ich habe darüber nachgedacht, damit Dinge wie E-Mails oder die schnelle Generierung von IronPython-Code zu generieren. Da diese keine Tags verwenden, ist es wahrscheinlich besser, andere Alternativen zu prüfen. Danke für die Antwort.
Thomas
6
@Thomas Razor sollte in diesen Szenarien gut funktionieren, Sie müssen nur diese magischen <text>Tags hinzufügen oder ab @:und zu verwenden. Sobald die Unterstützung des VS-Editors für die Razor-Syntax herauskommt, ist es ziemlich einfach zu erkennen, wann die Übergänge auftreten.
Marcind
34

Überprüfen Sie RazorEngine , es ist ein kleines Framework, das auf Razor basiert und es Ihnen ermöglicht, dies zu tun.

Ariel
quelle
Hatte Probleme bei der Installation dieses Projekts auf der .net 4-Targeting-Anwendung, erfordert Updates.
Johnny_D
21

Schauen Sie sich die RazorTemplates- Bibliothek an. Es ist leichter als die RazorEngine-Bibliothek, threadsicher und hat eine sehr schöne minimale Benutzeroberfläche.

Das Kompilieren und Rendern einer Vorlage ist so einfach wie zwei Codezeilen:

var template = Template.Compile("Hello @Model.Name!");
Console.WriteLine(template.Render(new { Name = "World" }));
alexey
quelle
1
Heben Sie die Thread-Sicherheit von RazorTemplates b / c hervor, eine der anderen vorgeschlagenen Lösungen für diese Frage ist dies nicht? Ich interessiere mich speziell für RazorEngine.
Steve Scheffler
9

Sowohl RazorEngine als auch RazorTemplates werden hier bereits erwähnt, aber sehen Sie sich RazorMachine an . Sie können Ihre Nicht-MVC-App einfach auf einen ~ / Views-Ordner einer (anderen) vorhandenen MVC-App verweisen, mit dem Senden des richtigen Modells ausführen und die gerenderte Ausgabe in zwei Codezeilen erhalten:

var sb = new StringBuilder();

//RazorMachine magic:
//*tweets* is basically List<TwitterPost> - simple collection of custom POCO
//first param for rm.ExecuteUrl points to ~/Views folder, MVC style
var rm = new RazorMachine(htmlEncode: false);
ITemplate template = rm.ExecuteUrl("~/twitter/twitter", tweets);

//do whatever you want with result
sb.Append(template);
Antonin Jelinek
quelle
3

Code oder Text generieren: Sie meinen wie T4-Vorlagen: http://msdn.microsoft.com/en-us/library/bb126445.aspx oder Codesmith-Tools?

Brian Mains
quelle
Dies erfordert Upvotes, da T4 Ähnlichkeiten mit Razor aufweist und ein tatsächlicher Allzweck-Codegenerator ist, der sofort als Funktion in Visual Studio ausgeliefert wird - im Wesentlichen handelt es sich um ein Allzweck-Rasiermesser
Dan Ling,
Nach meinem Verständnis können T4-Vorlagen nur zur Kompilierungszeit geändert werden. Die .tt-Datei wird in eine .cs-Datei konvertiert und als .cs-Datei gespeichert. In meiner Verwendung möchte ein semitechnischer Benutzer die Vorlage aktualisieren, ohne die Anwendung neu erstellen zu müssen. Gibt es eine einfache Möglichkeit, dies mit T4-Vorlagen zu erreichen?
Daveb
Nun, möglicherweise, solange alles, was es generiert, interpretiert werden kann, wie CSHTML zur Laufzeit von der Razor-Engine ausgeführt werden kann. Sie können es auch programmierbar auslösen, um Code zu generieren, aber kompilierter Code muss vom Compiler analysiert werden, um verwendbar zu sein ....
Brian Mains