Est-il possible d'utiliser Razor View Engine en dehors de asp.net

102

Si je regarde le moteur de visualisation Razor, je vois une syntaxe très agréable et concise qui n'est pas particulièrement liée à la génération de HTML. Je me demande donc à quel point serait-il facile d'utiliser le moteur en dehors de asp.net dans un environnement "normal" .net par exemple pour générer du texte, du code, ...

Tout pointeur, exemple, commentaire ou explication est le bienvenu.

Thomas
la source

Réponses:

80

Il y a deux problèmes ici:

  1. Oui, vous pouvez exécuter Razor View Engine en dehors du contexte d'un domaine d'application ASP.NET, comme expliqué dans le blog d'Andrew: http://vibrantcode.com/blog/2010/11/16/hosting-razor-outside-of -aspnet-révisé-pour-mvc3-rc.html
  2. Cependant, Razor se concentre toujours principalement sur la génération de balisage de type xml (par exemple HTML) dans le sens où l'analyseur Razor utilise la présence de <tags>pour déterminer la transition entre le code et le balisage. Vous pouvez probablement l'utiliser pour générer du texte, mais vous pouvez rencontrer des problèmes lorsque votre sortie ne correspond pas aux hypothèses de Razor sur vos intentions.

Par exemple, tant qu'il s'agit d'un code Razor valide (à cause de la <div>balise):

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

L'extrait de code suivant n'est pas valide (car Hello! Est toujours traité comme du code):

@if(printHello) {
   Hello!
}

Cependant, il existe une <text>balise spéciale qui peut être utilisée pour forcer une transition pour les blocs multi-lignes (la <text>balise ne sera pas rendue):

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

Il existe également une syntaxe plus courte pour forcer la transition d'une seule ligne en utilisant @::

@if(printHello) {
   @:Hello!
}
Marcind
la source
2
Eh bien, je pensais l'utiliser pour générer des choses comme des e-mails ou la génération de code IronPython à la volée. Comme ceux-ci n'utilisent pas de balises, il est probablement préférable de regarder d'autres alternatives. Merci d'avoir répondu.
Thomas le
6
@Thomas Razor devrait très bien fonctionner dans ces scénarios, vous allez juste devoir ajouter ces <text>balises magiques ou les utiliser de @:temps en temps. Une fois que le support de l'éditeur VS sortira pour la syntaxe Razor, il sera assez facile de dire quand les transitions se produiront.
marcind
34

Vérifiez RazorEngine , c'est un petit framework construit sur Razor qui vous permet de le faire.

Ariel
la source
J'ai eu des problèmes pour installer ce projet sur l'application de ciblage .net 4, nécessite des mises à jour.
Johnny_D
22

Jetez un œil à la bibliothèque RazorTemplates . Elle est plus légère que la bibliothèque RazorEngine, elle est sûre pour les threads et possède une très belle interface minimale.

La compilation et le rendu d'un modèle sont aussi simples que deux lignes de code:

var template = Template.Compile("Hello @Model.Name!");
Console.WriteLine(template.Render(new { Name = "World" }));
Alexey
la source
1
Mettez-vous en évidence la sécurité des threads de RazorTemplates b / c l'une des autres solutions suggérées pour cette question n'est pas? Je suis particulièrement intéressé par RazorEngine.
Steve Scheffler
9

Les deux RazorEngine et RazorTemplates sont déjà mentionnés, mais vérifier RazorMachine . Vous pouvez simplement pointer votre application non MVC vers un dossier ~ / Views d'une (autre) application MVC existante, l'exécuter en envoyant le modèle approprié et obtenir la sortie rendue sur 2 lignes de code:

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
la source
3

Générer du code ou du texte: vous voulez dire comme des modèles T4: http://msdn.microsoft.com/en-us/library/bb126445.aspx ou des outils de création de codes?

Brian Mains
la source
Cela nécessite des votes positifs car T4 a des similitudes avec Razor et est un véritable générateur de code polyvalent qui est livré prêt à l'emploi en tant que fonctionnalité de Visual Studio - il s'agit essentiellement d'un `` Razor '' polyvalent
Dan Ling
Je crois comprendre que les modèles T4 ne peuvent être modifiés qu'au moment de la compilation, le fichier .tt est converti et enregistré en tant que fichier .cs. Dans mon utilisation, un utilisateur semi-technique aimerait mettre à jour le modèle sans avoir à reconstruire l'application. Existe-t-il un moyen simple d'y parvenir en utilisant des modèles T4?
daveb
Eh bien peut-être, tant que tout ce qu'il génère peut être interprété, comme CSHTML peut l'être par le moteur Razor lors de l'exécution. Vous pouvez également le déclencher par programmation pour générer du code, mais le code compilé doit être analysé par le compilateur pour être utilisable ....
Brian Mains