Mvc 模板化的Razor引擎委托

  最近在研究NopCommerce,它后台用的富文本编辑器可根据语言库加载不同语言的编辑器,其中用到了模板化Razor引擎委托,参考这儿

  废话不多说,直接上代码。

 1 public static class HtmlExtensions
 2     {
 3         public static HelperResult ToList<T>(this IEnumerable<T> items, Func<T, HelperResult> template)
 4         {
 5             return new HelperResult(writer =>
 6             {
 7                 foreach (var item in items)
 8                 {
 9                     template(item).WriteTo(writer);
10                 }
11             });
12         }
13     }

  方法 ToList<T>拓展了IEnumerable<T>,并传递一个Fun<T,out result>参数,Fun中result类型为 HelperResult,HelperResult中有ToHtmlString()方法,可把它转为string字符串, 在方法内部new HelperResult(),在构造函数内将模板生成的html写到HelperResult中。

  在cshtml文件中调用的代码如下:

@{
    var items = new[] { "tom", "kluas", "jerry" };
}
<ul>
    @items.ToList(@<li>@item</li>)
</ul>

  生成的html代码如下:

<ul>
    <li>tom</li>
    <li>kluas</li>
    <li>jerry</li>
</ul>

  调用 @items.ToList(@<li>@item</li>),T为string, @<li>@item</li>为模板,@item为模板中使用的参数,也是ToList<T>方法中foreach循环传递给模板文件的参数,最终生成3条<li>。

posted @ 2015-09-16 14:18  tomkluas  阅读(255)  评论(0编辑  收藏  举报