¿Es posible usar Razor View Engine fuera de asp.net?


102

Si miro el motor de vista de Razor, veo una sintaxis muy agradable y concisa que no está particularmente ligada 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, ...

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

Respuestas:


80

Hay dos problemas aquí:

  1. Sí, puede ejecutar Razor View Engine 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-revisado-para-mvc3-rc.html
  2. Sin embargo, Razor todavía se centra principalmente en generar marcado tipo xml (por ejemplo, HTML) en el sentido de que el analizador de Razor utiliza la presencia de <tags>para determinar la transición entre el código y el marcado. Probablemente pueda usarlo para generar cualquier texto, pero puede tener problemas cuando su salida no coincide con las suposiciones de Razor sobre cuáles son sus intenciones.

Entonces, por ejemplo, si bien este es un código Razor válido (debido a la <div>etiqueta):

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

El siguiente fragmento no es válido (porque Hello! Todavía se trata como código):

@if(printHello) {
   Hello!
}

Sin embargo, hay una <text>etiqueta especial que se puede usar para forzar una transición para bloques de varias líneas (la <text>etiqueta no se procesará):

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

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

@if(printHello) {
   @:Hello!
}

2
Bueno, estaba pensando en usarlo para generar cosas como correos electrónicos o generación de código IronPython sobre la marcha. Dado que estos no usan etiquetas, probablemente sea mejor buscar otras alternativas. Gracias por la respuesta.
Thomas

6
@Thomas Razor debería funcionar bien en esos escenarios, solo tendrás que agregar esas <text>etiquetas mágicas o usarlas de @:vez en cuando. Una vez que salga el soporte del editor VS para la sintaxis de Razor, será bastante fácil saber cuándo se producen las transiciones.
marcind

34

Compruebe RazorEngine , es un pequeño marco construido sobre Razor que le permite hacer esto.


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

22

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 renderizar 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á destacando la seguridad de subprocesos de RazorTemplates porque una de las otras soluciones sugeridas para esta pregunta no lo es? Estoy interesado específicamente en RazorEngine.
Steve Scheffler

9

Tanto RazorEngine como RazorTemplates ya se mencionan aquí, pero consulte RazorMachine . Simplemente puede apuntar su aplicación que no es MVC a una carpeta ~ / Views de (otra) aplicación MVC existente, ejecutar con el envío del modelo adecuado y obtener la salida renderizada 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);

3

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


Esto necesita votos positivos porque T4 tiene similitudes con Razor y es un generador de código de uso múltiple real que se envía fuera de la caja como una función en Visual Studio; esencialmente es un 'Razor' para todo uso
Dan Ling

Tengo entendido que las plantillas T4 solo se pueden cambiar en el momento de la compilación, el archivo .tt se convierte y se guarda como un archivo .cs. En mi uso, a un usuario semitécnico le gustaría actualizar la plantilla sin tener que reconstruir la aplicación. ¿Existe una manera fácil de lograr esto usando plantillas T4?
daveb

Bueno, posiblemente, siempre y cuando se pueda interpretar lo que sea que esté generando, como CSHTML puede serlo por el motor Razor en tiempo de ejecución. También puede activarlo mediante programación para generar código, pero el compilador debe analizar el código compilado para que sea utilizable ...
Brian Mains
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.