2009-05-22 10 views
8

Possiedo un'applicazione della console .NET che deve generare alcuni file HTML. Potrei semplicemente costruire l'HTML in un StringBuilder e scrivere il contenuto in un file, ma stavo pensando che sarebbe stato meglio usare un qualche tipo di file di modello con segnaposto per dove vanno i dati e poi elaborare i miei dati attraverso di esso in fase di runtime.Generazione di HTML utilizzando un modello da un'applicazione .NET

Sto indovinando ci sono modi per utilizzare aspx, o T4, o di alcuni dei motori di vista alternativo che è possibile utilizzare con ASP.NET MVC, ma non so che cosa sarebbe più semplice da integrare in una console applicazione (o come farei per integrarli).

voglio finire in grado di chiamare qualcosa del tipo:

GenerateHtml(htmlPath, template, customDataObject); 

risposta

3

Come detto da Matt, spark è bello ma potrebbe essere eccessivo per alcuni modelli semplici e diventa complicato se non lo si utilizza in MVC.

Personalmente ho avuto un sacco di successo con NVelocity e ho anche pubblicare un semplice esempio/involucro di usarlo: http://simpable.com/code/simpletemplate/

Inoltre, tutta l'esecuzione del sistema tematizzazione del GraffitiCMS su NVelocity (anche se avrei usato scintilla se era disponibile per questo compito).

-Scott

+0

sì, ho guardato NVelocity. sembra la soluzione più promettente per il mio problema. Non riesco a capire dove scaricare la versione "nuova" che il progetto del castello ha realizzato. –

+0

alla fine ho funzionato dopo aver scaricato l'intera fonte del progetto del castello e costruendo il mio NVelocity.dll. Ci è voluto anche un po 'di tempo per capire come caricare correttamente il mio modello, ma una volta che l'ho fatto soddisfa perfettamente le mie esigenze. grazie –

+2

Hey Scott, sarebbe stato bello avere almeno alcuni suggerimenti su questa pagina. A quanto pare il sito web è in calo – samy

14

Un modo che si possa fare questo è creare un file XSL come modello, puntate il vostro customDataObject come XML quindi eseguire una trasformazione per generare l'HTML richiesto.

Aggiornamento: Mentre mi piace (e uso) il metodo di sostituzione delle stringhe consigliato da altre persone qui, c'è una certa flessibilità nell'uso di XML/XSL. Supponiamo che il tuo oggetto abbia una proprietà che è un elenco, ad esempio un oggetto ordine con un elenco di oggetti di elementi pubblicitari, devi praticamente scrivere nel codice la logica che deve rendere gli elementi pubblicitari.

Con XSL tutto ciò che si fa è passare l'XML dell'oggetto dell'ordine serializzato all'XSL e lasciare che l'XSL gestisca qualsiasi HTML di cui ha bisogno per generare. Ciò significa che puoi spesso modificare l'XSL in posizione o avere varianti (riepilogo dell'ordine, ordine dettagliato, ecc.) Senza aggiungere altro codice alla tua app con tutti i fastidi extra di ricostruzione/distribuzione.

Ma tutto dipende dalla complessità di ciò che è necessario eseguire il rendering, per alcuni lavori la sostituzione delle stringhe è più ovvia, per altri XSL è il modo. Come ho detto, usiamo entrambi.

6

Ecco alcuni codice che illustra un modo abbastanza semplice da realizzare quello che stai cercando di fare:

using System; 
using System.IO; 

public class HtmlTemplate 
{ 
    private string _html; 

    public HtmlTemplate(string templatePath) 
    { 
     using (var reader = new StreamReader(templatePath)) 
      _html = reader.ReadToEnd(); 
    } 

    public string Render(object values) 
    { 
     string output = _html; 
     foreach (var p in values.GetType().GetProperties()) 
      output = output.Replace("[" + p.Name + "]", (p.GetValue(values, null) as string) ?? string.Empty); 
     return output; 
    } 
} 

public class Program 
{ 
    void Main() 
    { 
     var template = new HtmlTemplate(@"C:\MyTemplate.txt"); 
     var output = template.Render(new { 
      TITLE = "My Web Page", 
      METAKEYWORDS = "Keyword1, Keyword2, Keyword3", 
      BODY = "Body content goes here", 
      ETC = "etc" 
     }); 
     Console.WriteLine(output); 
    } 
} 

Usando questo, tutto ciò che dovete fare è creare alcuni modelli HTML e riempirli con gettoni sostituibili tali come [TITLE], [METAKEYWORDS], ecc. Quindi passare oggetti anonimi che contengono i valori per sostituire i token con. È anche possibile sostituire l'oggetto valore con un dizionario o qualcosa di simile.

+0

questo è bello, anche se manca la capacità di anello intorno una collezione che avrei nee d come la mia pagina HTML ha bisogno di costruire un elenco di elementi formattati. –

+0

Come ho già detto, è possibile utilizzare un dizionario anziché un oggetto hardcoded; questo significherebbe che puoi fare in modo che una raccolta passi in loop se non sai al momento della compilazione quali saranno i tuoi campi. –

1

Un'altra opzione invece di utilizzare XSLT come suggerisce Kev è utilizzare la formattazione di stringhe con nome. Utilizzando il codice like this example di Phil Haack.

Qui è possibile avere il modello come stringa (letto da un file) e formattarlo utilizzando l'oggetto specificato.

Ora si potrebbe fare qualcosa di simile:

var person = new { FirstName = "rune", LastName = "grimstad" }; 
string template = "<html><body><h1>Hello {FirstName} {LastName}</h1></body></html>"; 
string html = NamedFormat(template, person); 
Problemi correlati