È possibile utilizzare Razor View Engine al di fuori di asp.net


102

Se guardo il motore di visualizzazione Razor, vedo una sintassi molto carina e concisa che non è particolarmente legata alla generazione di html. Quindi mi chiedo, quanto sarebbe facile utilizzare il motore al di fuori di asp.net in un ambiente .net "normale", ad esempio per generare testo, codice, ...

Qualsiasi puntatore, esempio, commento o spiegazione è il benvenuto.

Risposte:


80

Ci sono due problemi qui:

  1. Sì, puoi eseguire il motore di visualizzazione Razor al di fuori del contesto di un dominio di app ASP.NET, come spiegato nel blog di Andrew: http://vibrantcode.com/blog/2010/11/16/hosting-razor-outside-of -aspnet-revised-per-MVC3-rc.html
  2. Tuttavia, Razor è ancora principalmente focalizzato sulla generazione di markup di tipo xml (ad esempio HTML), nel senso che il parser Razor utilizza la presenza di <tags>per determinare la transizione tra codice e markup. Probabilmente puoi usarlo per generare qualsiasi testo, ma potresti incorrere in problemi quando il tuo output non corrisponde alle ipotesi di Razor su quali sono le tue intenzioni.

Quindi, ad esempio, mentre questo è un codice Razor valido (a causa del <div>tag):

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

Il frammento di codice seguente non è valido (perché Hello! Viene ancora trattato come codice):

@if(printHello) {
   Hello!
}

Tuttavia esiste un <text>tag speciale che può essere utilizzato per forzare una transizione per i blocchi multilinea (il <text>tag non verrà visualizzato):

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

Esiste anche una sintassi più breve per forzare la transizione di una singola riga utilizzando @::

@if(printHello) {
   @:Hello!
}

2
Beh, stavo pensando di usarlo per generare cose come e-mail o generazione di codice IronPython al volo. Poiché questi non utilizzano tag, probabilmente è meglio cercare altre alternative. Grazie per la risposta.
Thomas

6
@Thomas Razor dovrebbe andare bene in quegli scenari, dovrai solo aggiungere quei <text>tag magici o usarli @:ogni tanto. Una volta che il supporto dell'editor VS sarà disponibile per la sintassi Razor, sarà abbastanza facile capire quando si verificano le transizioni.
marcind

34

Controlla RazorEngine , è un piccolo framework costruito sopra Razor che ti permette di farlo.


Ha avuto problemi con l'installazione di questo progetto sull'applicazione di destinazione .net 4, richiede aggiornamenti.
Johnny_D

22

Dai un'occhiata alla libreria RazorTemplates . È più leggero della libreria RazorEngine, è thread-safe e ha un'interfaccia minimale molto carina.

La compilazione e il rendering di un modello sono semplici come due righe di codice:

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

1
Stai evidenziando la sicurezza del thread di RazorTemplates b / c una delle altre soluzioni suggerite per questa domanda non lo è? Sono interessato in particolare a RazorEngine.
Steve Scheffler

9

Sia RazorEngine che RazorTemplates sono già menzionati qui, ma controlla RazorMachine . Puoi semplicemente puntare la tua app non MVC a una cartella ~ / Views di (un'altra) app MVC esistente, eseguire con l'invio del modello corretto e ottenere l'output di rendering su 2 righe di codice:

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

Genera codice o testo: intendi come modelli T4: http://msdn.microsoft.com/en-us/library/bb126445.aspx o strumenti del Codemith?


Questo ha bisogno di voti positivi perché T4 ha somiglianze con Razor ed è un vero generatore di codice per tutti gli usi che viene fornito fuori dagli schemi come funzionalità in Visual Studio - essenzialmente è un 'Razor' per tutti gli usi
Dan Ling

A quanto mi risulta, i modelli T4 possono essere modificati solo in fase di compilazione, il file .tt viene convertito e salvato come file .cs. Nel mio utilizzo un utente semi-tecnico vorrebbe aggiornare il modello senza dover ricostruire l'applicazione. Esiste un modo semplice per ottenere questo risultato utilizzando i modelli T4?
daveb

Forse, a patto che tutto ciò che sta generando possa essere interpretato, come può essere CSHTML dal motore Razor in fase di esecuzione. Puoi anche attivarlo programmabilmente per generare codice, ma il codice compilato deve essere analizzato dal compilatore per essere utilizzabile ...
Brian Mains
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.