2009-10-05 35 views
62

Estoy buscando un motor independiente, fácil de usar desde C#, motor de plantillas. Quiero crear un archivo HTML y XML con marcadores de posición para datos, y llenarlos con datos de mi código.Motor de plantilla C#

El motor necesita para soportar bucles (la duplicación de partes de la plantilla forman más de un objeto) y condiciones (agregue partes de la plantilla al HTML/XML final solo si algunas condiciones son ciertas). ¿Puede alguien recomendarme una buena opción y agregar un enlace a más o menos ejemplos de código y una documentación sobre cómo usar el componente recomendado para mis necesidades?

También necesito usar bucles para duplicar filas de tablas, o incluso tablas enteras (en la versión HTML) y elementos complejos (en la versión XML).

+0

Véase también http://stackoverflow.com/questions/733378/whats-a-good-way-of-doing-string-templating- in-net – Simon

+0

http://stackoverflow.com/questions/9176859/generate-html-file-at-runtime-and-send-as-email-attachment/9177106#9177106 – adt

+0

Una alternativa de .NET a StringTemplate es https://github.com/beto-rodriguez/Templator, es simple y rápido y puedes instalarlo nuget 'Install-Package Tor' –

Respuesta

15

¿Qué hay de T4, Text Template Transformation Toolkit? Debe ajustarse a sus requisitos y está incorporado en Visual Studio.

Grandes recursos T4:

Oleg Sych's blog

T4 Editor

T4 Toolbox

+1

Una cosa más que debe señalarse es que este es un motor de plantillas con sintaxis C#. Por lo tanto, no es necesario aprender una nueva sintaxis de plantillas. –

6

¿Has mirado en XSLT? Tendrá que comenzar con su formato de datos fuente en XML, quizás al xmlserializar sus objetos de datos. ¡Puede hacer loops y if statements con facilidad!

Kathleen Dollard tiene a book on generating code via XSLT.

Personalmente, soy un gran admirador de T4 (especialmente al generar C#), pero puede encontrar que dado que XML y HTML son sus tipos de salida, XSLT lo tiene cubierto. Además, es muy multiplataforma.

+4

El problema con XSLT es XSLT 1.x realiza algunas tareas simples * dolorosas * y XSLT 2.x es un mito (o, al menos, no está disponible en mi pila) :( –

2

Tengo un motor de plantillas incorporado en mi biblioteca de clases que se ve y funciona de forma similar al ASP de estilo antiguo, o T4 para el caso.

Básicamente escribe el código C# en <%%> bloques, y puede hacer la mayoría de las cosas que C# puede hacer, con la limitación de que todo el archivo de plantilla se compila en un único método. En otras palabras, no puede definir clases de ayuda y tal dentro de la plantilla, pero para los métodos de ayuda puede hacer métodos anónimos.

Ejemplo:

<% 
    var firstname = "Bob"; 
    var count = 10; 

    for (Int32 index = 0; index < count; index++) 
    { 
%> 
<%= firstname %> x <%= index+1 %>/<%= count %> 
<% 
    } 
%> 

Esto entonces ser compilado a una clase C# en otro dominio de aplicación, y se puede ejecutar para devolver la cadena que contiene el texto producido.

También puede pasar un argumento a la plantilla y también a las bibliotecas de clases de referencia, lo que significa que puede pasar estructuras de datos personalizadas o acceder a la capa de acceso a datos o código de lógica comercial desde su plantilla.

Si quieres mirarlo, el código está disponible en mi biblioteca de clases de mi depósito de la subversión o la página Web:

Para los repositorios de subversión necesita un nombre de usuario y contraseña, ambos son "invitados", sin las comillas.

El código está en el proyecto/ensamblaje LVK.Text.Templating.

También, avíseme (vea el correo electrónico en la página de perfil, o deje un comentario) y le daré algunos ejemplos más.

+0

No entiendo muy bien por qué has reinventado ASP.NET ... –

+5

Considerando que lo estoy usando para generar código dentro de Visual Studio, entre otras cosas, no creo que sea factible configurar un motor ASP.NET completo localmente para eso. Rechazar en StringTemplate, como se menciona por otros, para tener un requisito de que necesitaría una configuración completa de IIS configurada para esto. –

+0

@silky ASP.NET no es solo un lenguaje de plantillas. – chakrit

1

Es posible que necesite este .NET Template Engine.

Código Plantilla:

$Book.StaticId$ 

ID: $bk.BookId$ - Author: $bk.Author.Name$ 

Length of the author's Name: $bk.Author.Name.Length$ 

C# Código:

class Author 
    { 
     public string Name 
     { 
      get 
      { 
       return "John Borders"; 
      } 
     } 
    } 
    class Book 
    { 
     public static string StaticId 
     { 
      get 
      { 
       return "AABB"; 
      } 
     } 
     public int BookId 
     { 
      get 
      { 
       return 100; 
      } 
     } 
     public Author Author 
     { 
      get 
      { 
       return new Author(); 
      } 
     } 
    } 
    public class PropertySample1 
    { 
     [STAThread] 
     static void Main() 
     { 
      TemplateEngine dt = new TemplateEngine(); 
      dt.LoadFromFile("Template.tpl"); 
      Book book = new Book(); 
      dt.SetValue("bk", book); 
      dt.UsingNamespace("CSharp,Demo"); 
      string output = dt.Run(); 
      Console.WriteLine(output); 
     } 
    } 

de salida es:

AABB 

ID: 100 - Author: John Borders 

12 
+9

No puedo imaginar por qué alguien pagaría por eso en lugar de simplemente usar plantillas T4. ¿Son mejores que las plantillas T4 de alguna manera? –

+1

T4 es plantillas compiladas, por lo tanto, el usuario no puede crear sus propias plantillas sin tener un compilador .NET. pero todavía hay muchas alternativas de código abierto –

9

SmartFormat es una biblioteca bastante simple que satisfaga todas sus necesidades. Está enfocado en componer texto en "lenguaje natural" y es ideal para generar datos a partir de listas o aplicar lógica condicional.

La sintaxis es muy similar a String.Format, y es muy simple y fácil de aprender y usar. He aquí un ejemplo de la sintaxis de la documentación:

Smart.Format("{Name}'s friends: {Friends:{Name}|, |, and}", user) 
// Result: "Scott's friends: Michael, Jim, Pam, and Dwight" 

La biblioteca es de código abierto y fácilmente extensible, por lo que también puede mejorar con características adicionales.