Razor模板引擎
2015-08-22 19:53
471 查看
Razor模板引擎
Razor模板引擎使用
模板引擎:Razor、Nvelocity、Vtemplate。 Razor有VS自动提示,而且有助于学习asp.net mvc。借助于开源的RazorEngine,我们可以在非asp.net mvc项目中使用Razor引擎,甚至在控制台、WinForm项目中都可以使用Razor(自己开发代码生成器)
在非mvc项目中创建Razor文件(cshtml ,可以利用自动提示)的方法,新建一个html,改名为cshtml。
Razor中@后面跟表达式表示在这个位置输出表达式的值,模板中Model为传递给模板的对象。
@{}中为C#代码,C#代码还可以和html代码混排
由于不是在MVC项目中,所以无法使用@Html.DropDownList、@Url.Encode()等。
解析razor文件
public static string Parse(HttpContext context, string fileVirtualPath, object model) { string fullPath = context.Server.MapPath(fileVirtualPath); string cacheName = fileVirtualPath+File.GetLastWriteTime(fullPath).ToString(); string result = Razor.Parse(File.ReadAllText(fullPath), model, cacheName); return result; }
关于cacheName
cacheName写成一个固定的值,当cshtml发生改变的时候Parse的结果也是修改后的内容经过反编译发现Parse方法最终调用的是TemplateService的GetTemplate方法,代码如下:
private ITemplate GetTemplate<T>(string razorTemplate, object model, string cacheName) { Func<string, CachedTemplateItem, CachedTemplateItem> updateValueFactory = null; CachedTemplateItem item; if (razorTemplate == null) { throw new ArgumentNullException("razorTemplate"); } int hashCode = razorTemplate.GetHashCode(); if (!this._cache.TryGetValue(cacheName, out item) || (item.CachedHashCode != hashCode)) { Type templateType = this.CreateTemplateType(razorTemplate, (model == null) ? typeof(T) : model.GetType()); item = new CachedTemplateItem(hashCode, templateType); if (updateValueFactory == null) { updateValueFactory = (n, i) => item; } this._cache.AddOrUpdate(cacheName, item, updateValueFactory); } return this.CreateTemplate(null, item.TemplateType, model); }
代码大意是:从缓存cache中查找是否有名字等于cacheName的缓存项“TryGetValue(cacheName, out item)”,如果不存在,则编译创建;如果存在,则再检查缓存中的cshtml内容的hashCode(字符串的特征码,相同的字符串的HashCode一样,不同字符串的HashCode有一样的概率)和这次传进来的razorTemplate的HashCode是否一样,如果不一样也重新编译创建,而不使用缓存的。
Razor调用外部方法
public static RawString raw(string name, string id, bool isChenk) { StringBuilder sb = new StringBuilder(); sb.Append("<input type='checkbox' id='").Append(id).Append("' name='").Append(name).Append("'"); if (isChenk) { sb.Append("checked"); } sb.Append("/>"); return new RawString(sb.ToString()); }
@using Razor2; <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <title></title> </head> <body> @Razor2.raw("c1", "c2", false) </body> </html>
@后面的表达式如果是string类型,那么输出的时候就会自动进行htmlEncode。如果不想进行htmlencode的显示,则可以自己封装一个Raw方法:
public static RawString Raw(string str)
{
return new RawString(str);
}
然后@RPHelper.Raw(Model.Html)
相关文章推荐
- Sublime Text Package Control
- 欢迎使用CSDN-markdown编辑器
- 大龄屌丝自学笔记--Java零基础到菜鸟--008
- oracle脚本执行多条语句报错
- js怎么判断一个对象是文本框(text)还是下拉框(select)
- bash的配置文件以及加载的顺序
- 网易电面-静态库与动态库
- USBDM Debugger interface for Freescale RS08,HCS08,HCS12,Coldfire and ARM-Kinetis Devices.
- 操作系统也谈"算法"
- 查看网卡信息及状态和网卡日志信息
- HDU 4348 To the moon
- Java--线程
- 微信公众平台服务号如何申请
- 网页显示UIWebView(一个)
- 安卓开发颜色代码
- Python3.X 抓取网络资源
- 有向图中两个结点之间是否存在一条路径
- #import与@class区别
- 哈希表及处理冲突的方法
- struts/Servlet,action转到jsp后,路径问题(struts2,jsp路径,action路径,action跳转,相对路径,绝对路径)