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

时间: 2024-10-11 00:08:31

Mvc 模板化的Razor引擎委托的相关文章

[asp.net mvc 奇淫巧技] 02 - 巧用Razor引擎在Action内生成Html代码

在web开发中经常会遇到在内部代码中获取Html,这些Html是需要和数据进行一起渲染.并不是直接把Html代码返回给客户端.这样的做法有很多应用场景,例如分页.Ajax一次性获取几段Html片段.生成邮件发送模板.生成Html静态页面等等.比较简单的或者容易想到的做法就是直接拼接Html,当然这肯定不是最合适的做法. 应用场景 1.在分页中,有一种做法是用ajax获取table的html代码和一些分页信息的Json var json = { "table": "<ta

ASP.NET MVC 系列:模板化机制

模版化的核心是定制ViewEngine.完整的模板化必须实现3个功能:1.网站的多套模版(razor)支持 2.模版的多样式(style)支持. 3.按需实现模版:没有实现的加载默认模版. 我们除了要达到上述3个功能目标,还必须不能影响MVC默认的项目目录和文件布局以及开放工具的智能提示,这样才是真正可用的.依惯例,喜欢自己研究的直接看Nop的源代码,喜欢直接看核心代码和演示Demo继续. 基础准备 1.新建一个空白ASP.NET应用程序,添加MVC引用.添加必要的Content.Scripts

MVC 模板页和布局

我们在以前的Asp.NET课程中已经学习过母版页了,在MVC中WebForm视图使用母版页的方法与以前基本相同. 创建一个项目MvcMasterPageDemo. 添加Home控制器,生成Index视图. 在生成视图的选框中,我们选择Aspx视图引擎,然后可以看到有"使用布局或母版页"的选项,给我们指向一个后缀为Master的文件(并不存在,所以无法完成视图添加). 现在我们自己去创建它. 找到对应的目录,添加一个母版页 我们将母版页的内容部分按视图选项卡下的名称来命名,这样就能在生成

Mvc模板页

以前学过WEB的应该都知道母版页这个东西,在这里呢,mvc的模板页和WEB中的模板页也是一样的效果和用途. 首先:创建一个项目,控制器,生成Index视图,在生成视图的时候我们选择Razor视图引擎,然后勾选"使用布局或母版页"选项,它默认引用的_Layout.cshtml页面的布局._ViewStart.cshtml文件里已经对页面进行了配置,所有的Razor引擎页面在执行之前,都会来执行这个ViewStart页面. @{ Layout = "~/Views/Shared/

Razor语法和Razor引擎大全

一.Razor语法 1.Razor的标识符 解释:@字符被定义为Razor服务器代码块的标识符,后面的表示是服务器代码了.web form中使用<%%>中写服务器代码一个道理.在vs工具里面提供了代码着色和智能感应的功能. @{ string userName = "启超"; <span>我的名字叫:@userName</span> <span>我的出生日期:@DateTime.Now.ToString("yyyy-MM-dd&

Razor引擎学习:RenderBody,RenderPage和RenderSection

RenderBody,RenderPage和RenderSection 1. RenderBody 在Razor引擎中没有了“母版页”,取而代之的是叫做“布局”的页面(_Layout.cshtml)放在了共享视图文件夹中.在这个页面中,会看到<body>标签里有这样一条语句: @RenderBody() 其实它的作用和母版页中的<contentplaceholder>服务器控件类似,当创建基于此布局页面的视图时,视图的内容会和布局页面合并,而新创建视图的内容会通过布局页面的@Ren

利用Aspose.Word控件和Aspose.Cell控件,实现Word文档和Excel文档的模板化导出

我们知道,一般都导出的Word文档或者Excel文档,基本上分为两类,一类是动态生成全部文档的内容方式,一种是基于固定模板化的内容输出,后者在很多场合用的比较多,这也是企业报表规范化的一个体现. 我的博客介绍过几篇关于Aspose.Word控件和Aspose.Cell控件的使用操作,如下所示. <使用Aspose.Cell控件实现Excel高难度报表的生成(一)> <使用Aspose.Cell控件实现Excel高难度报表的生成(二)> <使用Aspose.Cell控件实现Ex

MVC 插件化框架支持原生MVC的Area和路由特性

.NET MVC 插件化框架支持原生MVC的Area和路由特性 前面开放的源码只是简单的Plugin的实现,支持了插件的热插拔,最近晚上偶然想到,原生的MVC提供Areas和RouteAtrribute等路由特性标签,按照先前的做法,无法解析插件的路由特性和Areas,所以花费了两个晚上的时间,把插件给改进到支持Areas和路由特性,但同时也放弃了Web类插件的热插拔,Func类的插件依然支持热插拔. 下面是实现支持插件使用Areas和路由特性标签的流程: 原生的MVC在启动的时候需要执行两条代

关于Razor引擎的语法说明

1.在页面上显示字符串的值, 格式:a*@变量名 但@之前必须有空格,{.}等,使得a*不可以构成变量的字符. (图1.1,此种格式razor引擎不会解析该变量) (图1.2 razor引擎不会解析该变量) -------------------------- ps: 显示的格式如下: -------------------------- 我们的问题来了,如果我们要abc3怎么办? 2.在页面上显示@ 如需要在页面输出"@"字符可以使用HTML ASCII编码@ 3.语句@{....}