.NETでテンプレートを使ってCGI風にHTMLやテキストを動的生成する方法

この記事は公開から3年以上経過しています。

.NETアプリケーション開発でHTMLやCSVなどのテキストファイルを動的に生成する際、サードパーティ製ライブラリなどを使わず、StringBuilderで1行ずつゴリゴリ書いたり自前で置換などを行うこともなくPerl/ASP/PHP/BlazorのようなCGIライクな処理をT4で実現する方法。


手順&サンプルソースコード

本例はC#で説明していますが、VB.NETもほぼ同様です。

  1. C#のコンソールアプリケーションプロジェクトを作成し、プロジェクトに新しい項目の追加からランタイム テキスト テンプレートを選択してT4テンプレートファイルReport.ttを追加する。

    file

  2. 前項で作成したReport.ttに、動的にHTMLを生成するためのコードをHTMLとC#で記述する(Bootstrap5のCDNを利用しています)。

    T4テンプレートファイル

    <#@ template language="C#" #>
    <!DOCTYPE html>
    <html lang="en">
      <head>
        <meta charset="utf-8" />
        <meta name="viewport" content="width=device-width, initial-scale=1.0, shrink-to-fit=no" />
        <link
          href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/css/bootstrap.min.css"
          rel="stylesheet"
          integrity="sha384-EVSTQN3/azprG1Anm3QDgpJLIm9Nao0Yz1ztcQTwFspd3yD65VohhpuuCOmLASjC"
          crossorigin="anonymous"
        />
        <title><#= ReportData.Title #></title>
      </head>
    
      <body>
        <div class="container" style="padding: 50px">
          <div class="row">
            <div class="col">
              <h1><#= ReportData.Header #></h1>
            </div>
          </div>
          <div class="row">
            <div class="col">
              <div class="table-responsive">
                <table class="table">
                  <thead>
                    <tr>
                      <th>Name</th>
                      <th>Score</th>
                    </tr>
                  </thead>
                  <tbody>
                    <# foreach(var row in ReportData.Rows) { #>
                    <tr>
                      <td><#= row.Name #></td>
                      <td><#= row.Score #></td>
                    </tr>
                    <# } #>
                  </tbody>
                </table>
              </div>
            </div>
          </div>
        </div>
      </body>
    </html>
  3. プロジェクトに新規クラスファイルReportCode.csを追加し、前項で作成したテンプレートにデータを引き渡すコードを記述する。

    T4テンプレートの部分クラス&DTOクラス群

    using System.Collections.Generic;
    
    namespace T4Test210720
    {
        // Report.ttの部分クラス
        partial class Report
        {
            public ReportData ReportData { get; }
    
            public Report(ReportData reportData)
            {
                ReportData = reportData;
            }
        }
    
        // レポートデータ
        public sealed class ReportData
        {
            // タイトル
            public string Title { get; set; }
    
            // ヘッダ
            public string Header { get; set; }
    
            // テーブル行データ群
            public IReadOnlyCollection<RowData> Rows { get; set; }
        }
    
        // テーブル行データ
        public sealed class RowData
        {
            // 名前
            public string Name { get; set; }
    
            // スコア
            public string Score { get; set; }
        }
    }

    ※クラス名はT4テンプレート名と同じReportpartialキーワードがあることに注意。

  4. Program.csに、T4テンプレートへデータを引き渡してHTMLの生成&表示を行うコードを記述する。

    メイン処理

    using System.Diagnostics;
    using System.IO;
    
    namespace T4Test210720
    {
        internal class Program
        {
            private static void Main(string[] args)
            {
                // サンプルデータ
                var reportData = new ReportData
                {
                    Title = "Hello T4!",
                    Header = "An example of the T4 in C#",
                    Rows = new[]
                    {
                        new RowData { Name = "Foo", Score = "80" },
                        new RowData { Name = "Bar", Score = "50" },
                        new RowData { Name = "Baz", Score = "100" }
                    }
                };
    
                // レポートHTML生成
                var report = new Report(reportData);
                var reportHtml = report.TransformText();
                // レポートHTMLファイル生成
                var htmlFile = "test.html";
                File.WriteAllText(htmlFile, reportHtml);
                // レポートHTMファイル表示
                Process.Start(htmlFile);
            }
        }
    }

サンプルプログラムは以上です。上記コードを実行すると、下図のように動的生成したHTMLファイルを既定のウェブブラウザで表示します。

file

このときのHTMLソースは以下のとおりです。テンプレート内のコントロールブロック<# #>に記載したC#コードが実行された結果で動的にHTMLが生成されていることが確認できます。

file

ちなみにT4に関する詳細については下記参考ウェブサイト(Microsoft Docs)に、とてもわかりやすく説明されているので、ここでの説明は割愛します。


参考ウェブサイトなど

  • Microsoft Docs
    コード生成と T4 テキスト テンプレート

以上です。

シェアする

  • このエントリーをはてなブックマークに追加

フォローする