2009-05-22 16 views
8

Tengo una aplicación de consola .NET que necesita generar algunos archivos HTML. Podría simplemente construir el HTML en un StringBuilder y escribir el contenido en un archivo, pero estaba pensando que sería mejor utilizar algún tipo de archivo de plantilla con marcadores de posición para el lugar donde se encuentran los datos y luego procesar mis datos a través de él en tiempo de ejecución.Generando HTML usando una plantilla desde una aplicación .NET

Supongo que hay formas de usar aspx, o T4, o algunos de los motores de vista alternativos que puede usar con ASP.NET MVC, pero no sé qué sería más fácil de integrar en una consola aplicación (o cómo me gustaría integrarlos).

Quiero terminar capaz de llamar a algo de la forma:

GenerateHtml(htmlPath, template, customDataObject); 

Respuesta

3

Como mencionó Matt, la chispa es agradable, pero podría ser exagerada para algunas plantillas simples y se complica si no la está utilizando en MVC.

personalmente me han tenido mucho éxito con NVelocity y también publicar un ejemplo sencillo/envoltura en usarlo: http://simpable.com/code/simpletemplate/

Además, todo el sistema de tematización de ejecución de GraffitiCMS en NVelocity (aunque me hubiera utilizado chispa si estaba disponible para esta tarea).

-Scott

+0

sí, he estado buscando en NVelocity. parece la solución más prometedora para mi problema. No sé dónde descargar la "nueva" versión que el proyecto del castillo ha hecho. –

+0

eventualmente lo puse en funcionamiento después de descargar toda la fuente del proyecto del castillo y construir mi propio NVelocity.dll. También me tomó un tiempo averiguar cómo cargar mi plantilla correctamente, pero una vez que lo hice, cumple perfectamente con mis necesidades. gracias –

+2

Hola Scott, hubiera sido bueno tener al menos algunos consejos en esta página. Aparentemente el sitio web está caído – samy

14

Una forma en que podría hacerlo es crear un archivo XSL como la plantilla, serializar su customDataObject como XML continuación, realizar una transformación para generar el HTML requerido

Actualización: Si bien me gusta (y lo uso) el método de reemplazo de cadenas defendido por otras personas aquí, hay una cierta flexibilidad para usar XML/XSL. Supongamos que su objeto tiene una propiedad que es una lista, por ejemplo, un objeto de pedido con una lista de objetos de líneas de pedido, prácticamente tiene que grabar en el código la lógica que debe representar las líneas de pedido.

Con XSL, todo lo que haces es pasar el XML del objeto de pedido serializado al XSL y dejar que el XSL maneje cualquier HTML que necesite generar. Esto significa que a menudo puede editar el XSL en su lugar o tener variantes (resumen de pedido, orden detallado, etc.) sin agregar código adicional a su aplicación con todas las molestias adicionales de reconstruir/implementar.

Pero todo depende de la complejidad de lo que necesita renderizar, para algunos trabajos el reemplazo de cadenas es más obvio, para otros XSL es el camino. Como dije, usamos ambos.

6

Aquí hay algo de código que ilustra una forma bastante simple de lograr lo que estamos tratando de hacer:

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

uso de este, todo lo que tiene que hacer es crear algunas plantillas HTML y llenarlos con fichas intercambiables tales como [TITLE], [METAKEYWORDS], etc. Luego, pase objetos anónimos que contengan los valores para reemplazar los tokens. También podría reemplazar el objeto de valor con un diccionario o algo similar.

+0

esto es agradable, aunque se carece de la capacidad de bucle alrededor de una colección que me nee d ya que mi página HTML necesita construir una lista de elementos formateados. –

+0

Como dije, podría usar un diccionario en lugar de un objeto codificado; esto significa que puede tener una colección para recorrer si no sabe en tiempo de compilación cuáles serán sus campos. –

1

Otra opción en lugar de utilizar XSLT como Kev sugiere es usar el formato de cadena con nombre. Usando el código like this example de Phil Haack.

Aquí puede tener su plantilla como una cadena (puede leer de un archivo) y formatearla con el objeto dado.

Ahora usted podría hacer algo como esto:

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