miso_soup3 Blog

主に ASP.NET 関連について書いています。

RazorEngine で Html エンコード処理を行わないようにする

この前のcsHtml ファイルを使って RazorEngine の記事にて、

Html 以外で利用する場合、いちいち @Raw と書くのが少し面倒。

と書きましたが、エンコードしないで出力する設定方法がありました。

テンプレートで出力する前に、以下の様に設定を行います。

private static void RazorEngineSetup()
{
	var config = new TemplateServiceConfiguration();
	
	config.EncodedStringFactory = new RawStringFactory();
	//↑ここ
	var myConfiguredTemplateService = new TemplateService(config);
	Razor.SetTemplateService(myConfiguredTemplateService);
}

EncodedStringFactory に、new RawStringFactory() を指定すると、
Htmlエンコードされずに出力されます。

例えば下の様なテンプレートだと…

RazorEngineSetup();
var model = new { Name = "Taro", Message = "(>_ <)" };
var template = "Hello, @Model.Name! --> @Model.Message";

string result = Razor.Parse(template, model);
Console.WriteLine(result);

こう出力されます。

逆に、new HtmlEncodedStringFactory() を設定すると、(または設定を行わないと
こう出力されます。

メール文作成等で RazorEngine を使うときは、RawStringFactory を指定した方が良さそうです。

他の設定方法

この設定方法は、
https://github.com/Antaris/RazorEngine/wiki/2.-Template-Basics に書いてあるのですが、古い書き方とされています。
下部の Using the fluent API の書き方でもできます。

が、その場合別の問題として、下の古い書き方のコード、

var config = new TemplateServiceConfiguration();
config.BaseTemplateType = typeof(MyTemplate<>);

に該当する、TemplateBase<> を継承したカスタムテンプレートの型を指定する方法が見つからないという問題が…。