最近在研究NopCommerce,它后台用的富文本编辑器可根据语言库加载不同语言的编辑器,其中用到了模板化Razor引擎委托,参考这儿
废话不多说,直接上代码。
public static class HtmlExtensions
{
public static HelperResult ToList<T>(this IEnumerable<T> items, Func<T, HelperResult> template)
{
return new HelperResult(writer =>
{
foreach (var item in items)
{
template(item).WriteTo(writer);
}
});
}
}
方法 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>。