Razor模板引擎 (RazorEngine)

Razor模板引擎不仅在ASP.NET MVC中内置了Razor模板引擎,还有一个开源的RazorEngine,

这样以来我们可以在非ASP.NET MVC项目中使用Razor引擎,甚至在控制台,WinForm项目中都可以使用。

 

 

文件的创建

文件是一个后缀名为cshtml的文件,如果在非MVC项目中创建Razor文件,可以新建一个html,把后缀名该为cshtml。

 


 

RazorEngine使用初体验

一、前台:

二、后台代码

解释:

使用RazorEngine需提前在项目中引入它的程序集文件dll。

后台代码首先获得cshtml文件将其读成文本文件,在通过Razor.Parse将文本解析为,含义为Razor的模板,将其展出。访问的话应访问代码页面,cshtml只是一个展示模板,等待代码动态绘制内容使用cshtml模板展示.

 


 

 

Razor.Parse()方法

1.通过第二个参数,可以传一个object类型的对象,到前台(cshtml)模板。

string razor = RazorEngine.Razor.Parse(html, new { name = "zs", age = 12 });

注意:传入对象的访问权限,需为public

前台输出这个对象的值:

    <h1>@Model.name</h1>

    <h2>@Model.age</h2>  

 


RazorEngine原理

1.net在编译的时候会把.cshtml文件生成一个动态程序集,每次调用,就会每次生成一个不重复的动态程序集,这样看出会给服务器造成不容小视的压力。

解决办法:

Razor.Parse()方法的第三个参数cacheName

 

如果传入一个cacheName(名字随意),一旦编译成功,下次会使用缓存,不会重复生成新的动态程序集。

 

2.关于cacheName的问题

从上面的原理得知,如果给Razor.Parse()传入cacheName,下次调用可以使用缓存,那么会产生一个问题,cshtml文件如果发生了修改,如果还去调用缓存的话,那么结果会不如意。

解决办法:

将cacheName的值转为动态的:

         1.根据文件名+修改时间

         2.文件的MD5值作为cacheName

         3.文件流转换为新的文本字符串(获取文件内容)

         ........       

 

cacheName细节:

即使cacheName写成一个固定的值,当cshtml发生改变的时候Parse()方法执行后的结果,也会是发生改变的内容。

 

 

 


 

自己封装一个Razor.Parse()方法

 1     /// <summary>
 2         /// 自己封装一个Razor.Parse()方法
 3         /// </summary>
 4         /// <param name="context">上下文对象</param>
 5         /// <param name="cshtmlPath">.cshtml文件的相对路径</param>
 6         /// <param name="obj">要传入的对象参数</param>
 7         /// <returns>返回一个解析过的Razor模板字符串</returns>
 8         private string RazorParse(HttpContext context, string cshtmlPath,params object[] obj)
 9         {
10             //获得.cshtml文件的绝对路径
11             string path = context.Server.MapPath(cshtmlPath);
12             //通过路径将文件读成文本
13             string txt = File.ReadAllText(path);
14 
15             //为模板准备一个缓冲,根据文件的修改时间动态组合
16             string cacheName = path + File.GetLastWriteTime(path);
17 
18             //根据需求是否要传入对象参数,在调用Razor.Parse方法返回解析好的Razor模板
19             return obj.Length > 0 ? RazorEngine.Razor.Parse(txt, obj[0], cacheName) : RazorEngine.Razor.Parse(txt, cacheName);
20         
21         }
View Code

 


 

 

HtmlEncodeString()方法

在往模板传入字符串的格式,如果为html格式,该方法会将其转义,在模板显示字符串本身,而不会被模板解析为html标签

代码:

  public static HtmlEncodedString Test1()

        {

            return new HtmlEncodedString("<input type='text' />");

        }

 


 

 

RawString()方法

可以将类似于html的字符串,传入前台模板,可以被解析标签相应的含义

代码:

      public static RawString Test2()

        {

            return new RawString("<input type='text' />");

        }

 


 

 

Razor模板调用外部方法(在.cshtml模板页上调用在后台用C#写好的一个方法)

1.在.cshtml顶部引入方法的命名空间

@using 命名空间名称

2.调用

@类名.方法() ,不需要";"号。  如:@Handler1.Test1()

 

 

业务实例

通过外部方法生成一个Checked标签

 1     public static RawString CreateChecked_input(string id,bool isChecked)
 2 
 3         {
 4 
 5             StringBuilder sb = new StringBuilder();
 6 
 7             sb.Append("<input type='checkbox' id=" + id).Append("  checked="+ (isChecked==true?"checked":"")).Append(" />");
 8 
 9  
10             return new RawString(sb.ToString());   
11 
12  
13 
14         }

 

调用

 1 @using Demo.Razor
 2 <!DOCTYPE html>
 3 <html xmlns="http://www.w3.org/1999/xhtml">
 4 <head>
 5 <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
 6     <title></title>
 7 </head>
 8 <body>
 9        
10      @Handler1.CreateChecked_input("t1", true)
11 
12 </body>
13 </html>

 

总结:因为在后台很多数据时动态读取数据库的信息而组成的,将繁琐的拼接封装在后台,前台页面清晰,而封装的方法还可以重复利用到其他业务中

 


 

posted @ 2016-08-19 10:34  姜承轩  阅读(3963)  评论(1编辑  收藏  举报