2010-09-02 31 views
94

Si je regarde Razor View Engine, alors 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 s'il est facile d'utiliser le moteur en dehors d'asp.net dans un environnement "normal" .net par exemple pour générer du texte, du code, ...Est-il possible d'utiliser Razor View Engine en dehors d'asp.net?

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

Répondre

70

Il y a deux questions:

  1. Oui, vous pouvez exécuter le rasoir 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-revised-for-mvc3-rc.html
  2. Cependant, rasoir est toujours principalement axé sur la génération de balisage xml-like (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 pourriez rencontrer des problèmes lorsque votre résultat ne correspond pas aux hypothèses de Razor sur vos intentions.

Ainsi, par exemple alors que cela est valable code Razor (à cause de l'étiquette <div>):

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

L'extrait suivant est invalide (parce que le Bonjour est toujours traité comme code!):

@if(printHello) { 
    Hello! 
} 

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

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

Il y a aussi une syntaxe plus courte pour forcer une seule ligne de transition en utilisant @::

@if(printHello) { 
    @:Hello! 
} 
+2

Eh bien, je pensais l'utiliser pour générer des choses comme des e-mails ou du code IronPython à la volée. génération. Puisque ceux-ci n'utilisent pas de balises, il est probablement préférable de regarder d'autres alternatives. Merci d'avoir répondu. – Thomas

+6

@Thomas Razor devrait faire très bien dans ces scénarios, vous allez devoir ajouter ces balises magiques '' ou utiliser '@:' de temps en temps. Une fois que la prise en charge de l'éditeur VS sortira pour la syntaxe de Razor, il sera assez facile de savoir quand les transitions auront lieu. – marcind

3

Générer du code ou du texte: vous voulez dire T4 Templates: http://msdn.microsoft.com/en-us/library/bb126445.aspx ou des outils de codesmith?

+0

Cela doit upvotes car T4 a similarités avec Razor et est un vrai générateur de code qui sort de la boîte comme une fonctionnalité dans Visual Studio - essentiellement c'est un 'Razor' universel –

+0

Je crois comprendre que les modèles T4 ne peuvent être modifiés qu'à la compilation, le fichier .tt est converti en et enregistré en tant que fichier .cs.Dans mon utilisation, un utilisateur semi-technique souhaite mettre à jour le modèle sans avoir à reconstruire l'application. Y at-il un moyen facile que cela peut être réalisé en utilisant des modèles T4? – daveb

+0

Eh bien, peut-être, tant que tout ce qu'il génère peut être interprété, comme CSHTML peut être par le moteur Razor à l'exécution. Vous pouvez également le déclencher de façon programmée pour générer du code, mais le code compilé doit être analysé par le compilateur pour être utilisable .... –

32

Vérifiez RazorEngine, il est un peu cadre construit au-dessus de rasoir qui vous permet de le faire.

+0

Vous avez eu des problèmes lors de l'installation de ce projet sur l'application de ciblage .net 4, nécessite des mises à jour. –

+0

Ne fonctionne pas atm. Je cherche une autre option. –

18

Regardez la bibliothèque RazorTemplates. Il est plus léger que la bibliothèque RazorEngine, il est thread-safe et possède une très belle interface minimale.

et rendu un Compiler modèle est aussi simple que deux lignes de code:

var template = Template.Compile("Hello @Model.Name!"); 
Console.WriteLine(template.Render(new { Name = "World" })); 
+1

Mettez-vous en évidence la sécurité du thread 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. –

+1

Ce projet n'a pas été mis à jour depuis longtemps. –

7

Les deux RazorEngine et RazorTemplates sont déjà mentionnés, mais Vérifions RazorMachine. Vous pouvez simplement indiquer votre application non-MVC dans un dossier ~/Vues de (autre) application MVC existante, exécuter l'envoi modèle adéquat et obtenir une sortie rendu 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);