元々はこのブログ内で紹介されているのを見て気になった。
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デリゲート型なので関数として実行できる
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)
}
@{
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 以外を書くとどうなるの?
public int Grade { get; set; }
public int Class { get; set; }
public string Name { get; set; }
}
ところで、@item 以外を書くとどうなるの?
だめだった。@item は特別なパラメータなんだぜ(ってちゃんと書いてあるし)