2010-09-02 30 views
94

Si miro el Razor View Engine, entonces veo una sintaxis muy agradable y concisa que no está particularmente vinculada a la generación de html. Así que me pregunto, ¿qué tan fácil sería usar el motor fuera de asp.net en un entorno .net "normal", por ejemplo, para generar texto, código, ...¿Es posible usar Razor View Engine fuera de asp.net

Cualquier apuntador, ejemplo, comentario o explicación es bienvenido .

Respuesta

70

Hay dos cuestiones aquí:

  1. Sí, puede ejecutar la Navaja Vista Motor fuera del contexto de un dominio de aplicación ASP.NET, como se explica en el blog de Andrew: http://vibrantcode.com/blog/2010/11/16/hosting-razor-outside-of-aspnet-revised-for-mvc3-rc.html
  2. Sin embargo, la maquinilla de afeitar todavía se centra principalmente en la generación de marcado tipo xml (por ejemplo, HTML) en el sentido de que el analizador Razor usa la presencia de <tags> para determinar la transición entre el código y el marcado. Probablemente puedas usarlo para generar cualquier texto, pero podrías tener problemas cuando tu resultado no coincida con las suposiciones de Razor sobre cuáles son tus intenciones.

Así, por ejemplo, mientras que este es el código de la maquinilla de afeitar válida (debido a la etiqueta <div>):

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

El siguiente fragmento es válido (porque el Hola todavía está siendo tratado como código!):

@if(printHello) { 
    Hello! 
} 

sin embargo hay una etiqueta especial <text> que puede ser usado para forzar una transición para los bloques de líneas múltiples (la etiqueta <text> no se brindará):

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

También hay una sintaxis más corta para forzar una sola línea para la transición usando @::

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

Bueno, estaba pensando en usarlo para generar cosas como correos electrónicos o código sobre la marcha de IronPython Generacion. Como estos no usan etiquetas, probablemente sea mejor considerar otras alternativas. Gracias por la respuesta. – Thomas

+6

@Thomas Razor debería funcionar bien en esos escenarios, simplemente tendrá que agregar esas etiquetas mágicas '' o usar '@:' de vez en cuando. Una vez que el soporte del editor VS aparezca para la sintaxis de Razor, será bastante fácil saber cuándo ocurren las transiciones. – marcind

3

Generar código o texto: ¿quiere decir plantillas T4: http://msdn.microsoft.com/en-us/library/bb126445.aspx o herramientas de codesmith?

+0

Esto necesita upvotes porque T4 tiene similitudes con Razor y es un generador de código multiuso real que se envía de fábrica como una característica en Visual Studio; esencialmente es una 'Razor' multiusos –

+0

Tengo entendido que las plantillas T4 solo se pueden cambiar en tiempo de compilación, el archivo .tt se convierte y se guarda como un archivo .cs.En mi uso, un usuario semi-técnico quisiera actualizar la plantilla sin tener que reconstruir la aplicación. ¿Hay alguna manera fácil de lograr esto utilizando plantillas T4? – daveb

+0

Bueno, posiblemente, siempre que lo que esté generando se pueda interpretar, como CSHTML puede ser por el motor Razor en tiempo de ejecución. También puede desencadenarlo de forma programable para generar código, pero el código compilado debe ser analizado por el compilador para que sea utilizable ... –

32

Comprobar RazorEngine, que es un poco marco construido encima de la maquinilla de afeitar que le permite hacer esto.

+0

Tuve problemas para instalar este proyecto en la aplicación de orientación .net 4, requiere actualizaciones. –

+0

No funciona atm. Estoy buscando otra opción. –

18

Eche un vistazo a la biblioteca RazorTemplates. Es más liviano que la biblioteca RazorEngine, es seguro para subprocesos y tiene una interfaz mínima muy agradable.

Compilar y haciendo una plantilla es tan simple como dos líneas de código:

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

¿Está resaltando la seguridad de subprocesos de RazorTemplates b/c, una de las otras soluciones sugeridas para esta pregunta no? Estoy interesado específicamente en RazorEngine. –

+1

Este proyecto no se ha actualizado durante mucho tiempo. –

7

Tanto RazorEngine y RazorTemplates ya se mencionan aquí, pero echa un vistazo RazorMachine. Usted puede simplemente señalar que su aplicación no MVC a una carpeta ~/Vistas de la (otra) existentes aplicación MVC, ejecutar con el envío modelo adecuado y obtener resultado representado en 2 líneas de código:

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); 
Cuestiones relacionadas