normalian blog

Let's talk about Microsoft Azure, ASP.NET and Java!

RazorEngine の使い方 〜それなりな応用編 その2〜

前回紹介した RazorEngine のアセンブリ参照方法 id:waritohutsu:20130514:1368525761 について http://jsakamoto.tumblr.com/post/50628186640/razorengine-wa-na のコメントを頂いたので、実際に試してみた結果を共有する。

コンソールアプリの場合

コンソールアプリの場合、前回の投稿で記載した通り、Assembly.LoadFrom()等で明示的にサードパーティ製のアセンブリを読み込むことで対応が可能な様だ。以下のコードを利用することで、RazorEngine内でMarkdownSharpのアセンブリを利用している。また、出力時のHTMLエスケープ処理を抑止するために @Raw() メソッドを利用している点に留意して欲しい。

namespace RazorTemplateConsoleApp
{
   public class Person
    {
        public string Name { get; set; }
        public uint Age { get; set; }
        public IList<string> FavoriteTechs { get; set; }
    }

    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                Assembly.LoadFrom(Path.Combine(Directory.GetCurrentDirectory(), "MarkdownSharp.dll"));

                var viewBag = new DynamicViewBag();
                viewBag.AddValue("Comment", @"
# 見出し h1
## 見出し h2
### 見出し h3");
                Console.WriteLine(RazorEngine.Razor.Parse(@"@{
var str = new MarkdownSharp.Markdown().Transform(ViewBag.Comment);
}
@Raw(str)", STR_LIST, viewBag, "mycache")); //キャッシュ名がnullだと落ちる
            }
            catch (Exception e)
            {
                Console.WriteLine("ここは通らないと思われる:" + e.Message);
            }
        }
    }
}

アプリケーションの出力結果は以下となる。

<h1>見出し h1</h1>

<h2>見出し h2</h2>

<h3>見出し h3</h3>

ASP.NET MVC の場合

ASP.NET の場合は BuildManager が動的にアセンブリを読み込んでいるため、サードパーティ製のアセンブリを利用する場合でも明示的なアセンブリの読み込み処理は不要だ。以下のコードでも問題なく動作するので、是非確認して欲しい。また、こちらでも出力時のHTMLエスケープ処理を抑止するために @Raw() メソッドを利用している。

  • HomeController.cs の抜粋
    public class HomeController : Controller
    {
        private readonly string STR_LIST = "";
        public ActionResult Index()
        {
            var viewBag = new DynamicViewBag();
            viewBag.AddValue("Comment", @"
# 見出し h1
## 見出し h2
### 見出し h3");
            ViewBag.Message = RazorEngine.Razor.Parse(@"@{
var str = new MarkdownSharp.Markdown().Transform(ViewBag.Comment);
}
@Raw(str)", STR_LIST, viewBag, "mycache"); //キャッシュ名がnullだと落ちる

            return View();
        }
  • Index.cshtml の抜粋
@{
    ViewBag.Title = "Home Page";
}
@section featured {
    <section class="featured">
        <div class="content-wrapper">
            <hgroup class="title">
                <h1>@ViewBag.Title.</h1>
                <h2>@ViewBag.Message</h2>
            </hgroup>

出力結果は以下となる。

BuildManager の参考

ASP.NET MVC の内部に踏み込んでいるわけではないが、BuildManager の機能の参考にはなるだろう