source sistema pages net mvc code asp asp.net asp.net-mvc code-generation templating razor

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



github pages asp net (5)

Comprueba RazorEngine , es un pequeño marco construido encima de Razor que te permite hacer esto.

Si miro el Razor View Engine, entonces 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.


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" }));



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-revised-for-mvc3-rc.html
  2. Sin embargo, Razor 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.

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

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

El siguiente fragmento no es válido (porque Hello! Aún se está tratando como código):

@if(printHello) { Hello! }

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

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

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

@if(printHello) { @:Hello! }


Tanto RazorEngine como RazorTemplates ya se mencionaron aquí, pero echa un vistazo a 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 apropiado 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);