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>。