2013年2月12日火曜日

[ASP.NET MVC] テンプレートデリゲート



元々はこのブログ内で紹介されているのを見て気になった。
http://devadjust.exblog.jp/17749006/

> Phill Haack 氏のブログを参照されたし。


参照してみる。

Template Razor Delegate
http://haacked.com/archive/2011/02/27/templated-razor-delegates.aspx

なにこれ…という事で動かしてみたメモ。


上のブログの最初にあるコードがいきなりわからない。


@{
  Func<dynamic, object> b = @<strong>@item</strong>;
}
<span>This sentence is @b("In Bold").</span>




分解して考えてみる


Func<dynamic, object> 

     dynamic 型の引数を取って object 型を返すFuncデリゲート型

@<strong>@item</strong>
     Razorでこのように書くとたぶんFuncデリゲート型のオブジェクトが生成されるのだろう

@b("In Bold")
     b はFuncデリゲート型なので関数として実行できる



ブログ内の英語をがんばって読むと

・Razorでこう書くとFunc<T, HelperResult>が生成されるんだぜ
・@itemが特別なパラメータなんだぜ
・@itemはテンプレート内で何度も呼べるんだぜ

と書いてあるように見える(自信がない)



自分でなにか書いてみる。


■Razor(.chtml)のソース

@model IEnumerable<MvcApplication1.Models.SchoolViewModel>

@{
    ViewBag.Title = "TemplateRazorDelegateTest";
}

<h2>TemplateRazorDelegateTest</h2>

@{
    Func<dynamic, object> hogeFunc =
        @<div>
            @item.Grade 年
            @item.Class 組
            @item.Name さん
         </div>;

}

@foreach (var row in Model)
{
    @hogeFunc(row)
}



動いた。

row 変数には下記のクラスオブジェクトが入っている。


    public class SchoolViewModel
    {
        public int Grade { get; set; }
        public int Class { get; set; }
        public string Name { get; set; }
    }




ところで、@item 以外を書くとどうなるの?
だめだった。@item は特別なパラメータなんだぜ(ってちゃんと書いてあるし)