miso_soup3 Blog

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

csHtml ファイルを使って RazorEngine

試してみましたのでメモです。

実行

準備

NuGet で、RazorEngine をインストール後、
テンプレートファイル MessageTemplate.csHtml と、モデル用の MessageModel クラスを用意します。

・MessageModel クラス

public class MessageModel
{
	public string Name { get; set; }
	public bool IsFirstTime { get; set; }
}

・MessageTemplate.csHtml ファイル

出力

Web API プロジェクトのコントローラに書きましたが、Web API は全然関係ありません。(ステマ
下の用に書いて、出力させます。

public class ValuesController : ApiController
{
	[HttpGet]
	public String Get()
	{
		var model = new MessageModel() { Name = "Taro", IsFirstTime = true };

		String message = GetMessage(model);

		Debug.WriteLine(message);
		return message;
	}

	private string GetMessage(MessageModel model)
	{
		string template = GetTemplate("MessageTemplate");
		return Razor.Parse(template, model);
	}

	private string GetTemplate(String templateName)
	{
		String templatePath = Path.Combine(
			HttpContext.Current.Server.MapPath("~/Templates"), 
			String.Format("{0}.cshtml", templateName));
			
		return File.ReadAllText(templatePath);
	}
}
結果

いろいろと

インテリセンス

csHtml 側の最初で

@using RazorTemplage.TemplateModels;
@using RazorEngine.Templating;
@inherits TemplateBase<MessageModel>

と書いたのは、インテリセンスを効かせるためです。

こんなふうに効いてくれます。↓

参考:Intellisense and ReSharper

課題メモ

・if 文の中でインデントするとタブ文字が入ってしまう。インデントしたい。
Html 以外で利用する場合、いちいち @Raw と書くのが少し面倒。
RazorEngine で Html エンコード処理を行わないようにする
・あらかじめテンプレートをコンパイルできるので、出力時の時間は気にしなくても良い…のか?
・抽象化。

もうちょっとで使えそう…??