いろいろ備忘録日記

主に .NET とか Go とか Flutter とか Python絡みのメモを公開しています。

RazorEngineがすごく便利 (System.Web.Razorのラッパーライブラリ, テンプレートエンジン, Razor記法)


GitHubで公開されているRazorEngineがすごく使いやすかったのでメモメモ。

以前は、CodePlexで公開されていたのですが現在はGitHubに移行されてます。


RazorEngineを開発されている方のブログ


RazorEngineは、その名前の通りASP.NET MVCのビューエンジンで利用されている
Razor (System.Web.Razor) のエンジン部分を汎用的にしたライブラリです。
汎用的なテンプレートエンジンとして利用できます。


内部で、Razor本体を利用しているのでシンタックスは同じものが利用できます。
テンプレートエンジンでは、StringTemplate.NETなどが有名ですがRazor記法が
利用できるのはやっぱりいいですね。


利用方法はCodePlexのサイトにも記述されているのですが、めっちゃ簡単です。

var template = @"hogehoge @Model.Name...";
var model    = new { Name = "hehehehe" };
var result   = Razor.Parse(temlate, model);


で結果がとれます。他にもいろいろ機能があるみたいですが
まだ使ってないのでよくわかってません。


RazorEngineはNuGetに対応しているので

Install-Package RazorEngine

で参照設定できます。


とりあえず、単純にテンプレート文字列にモデルの値を展開して出力してみます。
HelloWorldみたいなもの。

namespace HelloRazorEngine
{
  using System;
  using System.Collections.Generic;
  using System.Linq;

  using RazorEngine;

  class Program
  {
    static void Main()
    {
      //
      // RazorEngineは、ASP.NET MVCにて利用されるRazorを内部で
      // 利用しているラッパーライブラリである。
      //
      // 内部で、System.Web.Razorを利用しているのでシンタックスは同じ。
      // 元々のRazorは、HTMLに特化しているが、RazorEngineはそれを
      // 汎用的に利用できるようにしてくれる。
      //
      // 利用方法は簡単で
      //   Razor.Parse(template, model)
      // で結果を受け取ることができる。
      //

      var template = @"Hello @Model.Name!!";
      var model    = new { Name = "RazorEngine" };
      var result   = Razor.Parse(template, model);

      Console.WriteLine(result);

      WaitForAnyKeyInput();
    }

    static void WaitForAnyKeyInput()
    {
      Console.WriteLine("Press any key to exit...");
      Console.ReadKey();
    }
  }
}


結果は

Hello RazorEngine!!
Press any key to exit...

となります。


ついでに、テンプレートエンジンをよく利用する場面ってことで
メールの文面を出力するサンプル。
あらかじめ、以下のテンプレートを作成して配置しておくとします。

@(Model.Name)様

この度は、@(Model.BlogName)を閲覧いただき、誠にありがとうございます。
サービスのお申し込みが完了いたしました。


───────────────────────────────────
■サービス内容■
───────────────────────────────────
会員ID...............: @Model.MemberId
申込日...............: @Model.StartDate

───────────────────────────────────

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
■お問い合わせ■
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
・カスタマーサポート @Model.BlogUrl
・メール       @Model.MailAddress
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━


んで、RazorEngineに食わせます。

namespace UseExternalTemplateFile
{
  using System;
  using System.Collections.Generic;
  using System.IO;
  using System.Linq;

  using RazorEngine;

  class Program
  {
    static void Main()
    {
      const string TemplateFilePath = @"Template/Thankyou.tpl";

      var template = File.ReadAllText(TemplateFilePath);
      var model    = new 
                     { 
                       Name        = "gsf.zero1", 
                       BlogName    = "いろいろ備忘録日記", 
                       MemberId    = "000001", 
                       StartDate   = DateTime.Now.ToShortDateString(), 
                       BlogUrl     = "ttp://d.hatena.ne.jp/gsf_zero1/", 
                       MailAddress = "dummy@dummy.com" 
                     };

      Console.WriteLine(Razor.Parse(template, model));

      WaitForAnyKeyInput();
    }

    static void WaitForAnyKeyInput()
    {
      Console.WriteLine("Press any key to exit...");
      Console.ReadKey();
    }
  }
}


結果は以下のようになります。

いろいろ機能あるみたいなので、勉強しつつメモできたらいいな。



================================
過去の記事については、以下のページからご参照下さい。

サンプルコードは、以下の場所で公開しています。