2010-09-02 8 views
94

Se guardo il Razor View Engine, vedo una sintassi molto carina e concisa che non è particolarmente legata alla generazione di html. Quindi mi chiedo quanto sarebbe facile usare il motore all'esterno di asp.net in un ambiente "normale" .net per generare testo, codice, ...È possibile utilizzare Razor View Engine all'esterno di asp.net

Qualsiasi puntatore, esempio, commento o spiegazione è benvenuto .

risposta

70

Ci sono due problemi qui:

  1. Sì, è possibile eseguire il rasoio View motore al di fuori del contesto di un dominio applicazione ASP.NET, come spiegato nel blog di Andrew: http://vibrantcode.com/blog/2010/11/16/hosting-razor-outside-of-aspnet-revised-for-mvc3-rc.html
  2. Tuttavia, Razor è ancora focalizzato principalmente sulla generazione di markup xml-like (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 siano le tue intenzioni.

Così, per esempio, mentre questo è un codice Razor valido (a causa del tag <div>):

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

Il seguente frammento è valido (perché il Ciao è ancora trattato come codice!):

@if(printHello) { 
    Hello! 
} 

Tuttavia c'è uno speciale <text> tag che possono essere utilizzati per forzare una transizione per i blocchi multilinea (il tag <text> non sarà reso):

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

C'è anche una sintassi più breve per forzare una singola linea di transizione utilizzando @::

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

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

+6

@Thomas Razor dovrebbe fare bene in questi scenari, dovrai aggiungere quei '' 'tag magici o usare' @: 'di tanto in tanto. Una volta che il supporto dell'editor VS è uscito per la sintassi di Razor, sarà abbastanza facile capire quando si verificano le transizioni. – marcind

3

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

+0

Questo deve upvotes perché T4 ha similitudini con Razor ed è un vero generatore di codice per tutti gli usi che viene fornito come funzionalità in Visual Studio - essenzialmente è un "Rasoio" per tutti gli usi –

+0

Sono a conoscenza del fatto che 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. C'è un modo semplice per raggiungere questo obiettivo utilizzando i modelli T4? – daveb

+0

Probabilmente, purché tutto ciò che genera può essere interpretato, come CSHTML può essere dal motore Razor in fase di esecuzione. Puoi anche attivarlo in modo programmabile per generare codice, ma il codice compilato deve essere analizzato dal compilatore per essere utilizzabile ... –

32

Controllare RazorEngine, è un po 'quadro costruito sulla cima di rasoio che ti permette di fare questo.

+0

Problemi nell'installazione di questo progetto su .net 4 applicazione di destinazione, richiede aggiornamenti. –

+0

Non funziona atm. Sto cercando un'altra opzione. –

18

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

Compilazione e il rendering di un modello è semplice come due righe di codice:

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

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

+1

Questo progetto non è stato aggiornato da molto tempo. –

7

Sia RazorEngine e RazorTemplates sono già menzionate qui, ma guarda che RazorMachine. Si può semplicemente puntare la vostra applicazione non MVC in una cartella ~/Vista di (un altro) esistente MVC app, eseguire con l'invio di modello appropriato e ottenere 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); 
Problemi correlati