2008-10-22 7 views
9

Est-il possible d'utiliser le moteur de modèle ASP (avec la classe code-behind partielle, les blocs dynamiques <% ...%> et autres) pour générer du code non HTML? Je veux avoir un moyen propre et maintenable de générer du code dynamiquement. (Spécifiquement, je veux générer le code LaTeX rempli avec des valeurs d'une base de données.)Utilisation du moteur de rendu aspx pour générer du code non

Actuellement, mes modèles LaTeX sont des chaînes de ressources avec des espaces réservés que je string.replace avec les valeurs de base de données. Cette solution devient rapidement très difficile à entretenir et à nettoyer. Je voudrais vraiment utiliser les blocs dynamiques du balisage aspx, mais je ne suis pas sûr a) si aspx jettera un ajustement quand la sortie n'est pas HTML, ou b) comment rendre le résultat dans un fichier .tex .

Le code générateur lui-même est situé dans un fichier C# .dll. Nous utilisons .NET 3.5

Est-ce possible? Merci d'avance.

Répondre

7

Le modèle T4 fourni avec Visual Studio 2008 nativement ou avec Visual Studio 2005 SDK vous permet de générer à peu près tout ce que vous voulez.

Vous pouvez avoir plus d'informations sur les liens suivants:

Je suis assez sûr que tous ces liens est un bon début pour y notre quête.

Si vous souhaitez générer des modèles T4 en dehors de Visual Studio, il est MSBuild personnalisé pour appeler un modèle T4 (link)

Voici un échantillon du code « Exécuter » de la tâche MSBuild. Click here for the source code:

public override bool Execute() 
{ 
    bool success = false; 

    //read in the template: 
    string template = File.ReadAllText(this.TemplatePath); 

    //replace tags with property and item group values: 
    ProjectHelper helper = new ProjectHelper(this); 
    template = helper.ResolveProjectItems(template); 

    //copy the template to a temp file: 
    this._tempFilePath = Path.GetTempFileName(); 
    File.WriteAllText(this._tempFilePath, template); 

    //shell out to the exe: 
    ProcessHelper.Run(this, TextTransform.ToolPath, TextTransform.ExeName, string.Format(TextTransform.ArgumentFormat, this.OutputPath, this._tempFilePath)); 
    success = true; 

    return success; 
} 
+0

D'après ma compréhension T4 est pour la génération de temps de conception. J'ai besoin de générer le latex à l'exécution, comme un asp. Si T4 peut être appelé au moment de l'exécution, il semble être le bon outil, mais je ne suis pas sûr que ce soit le cas. – Wyatt

+0

Juste édité cela et vous foundd un lien pour le générer à partir de MSBuild au lieu de Visual Studio. –

+0

Brillant! Merci. – Wyatt

0

Je ne vois pas pourquoi pas. Quelqu'un que je connaissais lors d'un travail précédent a créé un générateur de wrapper de base de données à l'aide de pages ASP.NET et le contrôle de répéteur pour insérer des propriétés. Il a ensuite écrit le contenu du document dans un fichier source.

Si vous êtes inquiet à propos de ASP.NET va jeter un ajustement, vous pouvez simplement créer un cas de test très limité et voir par vous-même. Ne devrait pas prendre beaucoup de temps pour tester une théorie et vous faire savoir si elle répond à vos besoins.

0

C'est certainement possible. La plupart des contrôles serveur seront désactivés, car ils émettront automatiquement un balisage HTML. Mais, vous pouvez databind la page et utiliser des expressions de liaison de données. Visual Studio se plaindra sans doute du balisage invalide.

Vous devez ensuite exécuter vos pages via Cassini ou le pipeline ASP.NET pour obtenir la sortie. J'ai un harnais de test unitaire quelque part, et c'est étonnamment facile.

Un mieux mieux, cependant, serait probablement d'utiliser un générateur de code. Quelque chose comme CodeSmith devrait fonctionner correctement, ou même le T4 intégré de Visual Studio vous donne beaucoup de flexibilité sans essayer de vous lier au HTML.

+0

Mais les modèles T4 peuvent-ils être rendus lors de l'exécution? – Wyatt

0

Oui, vous pouvez. Créez simplement une page .aspx standard, supprimez tout le code HTML et placez le contenu souhaité dans la page. Vous pouvez ensuite utiliser les balises <%%> pour placer du contenu dynamique dans la page. Et comme l'a dit Jason Z, vous pouvez utiliser le contrôle Repeater pour parcourir les collections d'éléments à afficher dans la "page". En outre, vous ne pourrez pas utiliser tous les autres contrôles serveur car ils génèrent du code HTML, mais vous pouvez toujours créer votre propre contrôle serveur et/ou vos contrôles utilisateur si nécessaire.

Questions connexes