web-dev-qa-db-fra.com

Moteur de modèle C #

Je suis à la recherche d'un moteur autonome, facile à utiliser à partir de code C #, de modèle. Je veux créer un fichier HTML et XML avec des espaces réservés pour les données et les remplir avec les données de mon code.

Le moteur doit prendre en charge les boucles (la duplication de parties du modèle forme plus d'un objet) et les conditions (ajouter des parties du modèle au HTML/XML final uniquement si certaines conditions sont remplies). Quelqu'un peut-il me recommander une bonne option et ajouter un lien vers plus ou moins un tel exemple de code et une documentation sur la façon d'utiliser le composant recommandé pour mes besoins?

J'ai également besoin d'utiliser des boucles pour dupliquer des lignes de table, ou même des tables entières (dans la version HTML) et des éléments complexes (dans la version XML).

67
me
22
Fredrik Mörk

Il y a un bon article sur l'utilisation du moteur RazorView: Comment créer un moteur de modèle de texte localisable à l'aide de RazorEngine

17
Malkov

Qu'en est-il de T4, Boîte à outils de transformation de modèle de texte ? Il doit correspondre à vos besoins et est intégré dans Visual Studio.

Excellentes ressources T4:

le blog d'Oleg Sych

Éditeur T4

Boîte à outils T4

16
Paolo Tedesco

SmartFormat est une bibliothèque assez simple qui répond à toutes vos exigences. Il se concentre sur la composition de texte en "langage naturel" et est idéal pour générer des données à partir de listes ou appliquer une logique conditionnelle.

La syntaxe est extrêmement similaire à String.Format, et est très simple et facile à apprendre et à utiliser. Voici un exemple de la syntaxe de la documentation:

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

La bibliothèque est open source et facilement extensible, vous pouvez donc également l'améliorer avec des fonctionnalités supplémentaires.

10
Scott Rippey

Avez-vous regardé XSLT ? Vous devrez commencer par votre format de données source en XML, peut-être en xmlsérialisant vos objets de données. Vous pouvez faire boucles et if instructions avec facilité!

Kathleen Dollard a n livre sur la génération de code via XSLT .

Personnellement, je suis un grand fan de T4 (en particulier lors de la génération de C #), mais vous constaterez peut-être que puisque XML et HTML sont vos types de sortie, XSLT vous couvre. De plus, c'est très multiplateforme.

6

J'ai un moteur de modèles intégré à ma bibliothèque de classes qui ressemble et fonctionne de manière similaire à l'ASP à l'ancienne ou au T4 d'ailleurs.

Vous écrivez essentiellement du code C # dans des blocs <%%> et pouvez donc faire la plupart des choses que C # peut faire, avec la limitation que le fichier de modèle entier est compilé en une seule méthode. En d'autres termes, vous ne pouvez pas définir de classes d'assistance et autres à l'intérieur du modèle, mais pour les méthodes d'assistance, vous pouvez faire des méthodes anonymes.

Exemple:

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

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

Celui-ci sera ensuite compilé dans une classe C # dans un autre domaine d'application et peut être exécuté pour renvoyer la chaîne contenant le texte produit.

Vous pouvez également passer un argument dans le modèle, ainsi que des bibliothèques de classes de référence, ce qui signifie que vous pouvez transmettre des structures de données personnalisées ou accéder à la couche d'accès aux données ou au code logique métier à partir de votre modèle.

Si vous voulez le regarder, le code est disponible dans ma bibliothèque de classes depuis mon référentiel Subversion ou page web:

Pour les référentiels Subversion, vous avez besoin d'un nom d'utilisateur et d'un mot de passe, tous deux sont "invités", sans les guillemets.

Le code se trouve dans le projet/assemblage LVK.Text.Templating.

Aussi, faites-le moi savoir (voir le courrier électronique sur la page de profil ou laissez un commentaire) et je vous fournirai d'autres exemples.

Vous pouvez en avoir besoin . NET Template Engine .

Code du modèle:

$Book.StaticId$

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

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

Code C #:

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

La sortie est:

AABB

ID: 100 - Author: John Borders

12
1