Razor模板解密

原创 2015年07月08日 21:11:14

RazorEngine将模板cshtml编译成了。一个程序集,每次编译运行,都会产生一个程序集;
可以用一个控制台程序打印出来,生成的“动态程序集“的名字(动态程序集是不能打印出磁盘中的位置的)

using RazorEngine;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;

namespace Razor解密
{
    class Program
    {
        static void Main(string[] args)
        {
            string cshtml = File.ReadAllText(@"C:\Users\Administrator\Desktop\ceshi\Web2\Web2\Razor.cshtml");
            for (int i = 0; i < 5; i++)
            {
                string html = Razor.Parse(cshtml);//将一个模板页转化为一个程序集
               // Console.WriteLine(html);
            }

            //找到本程序中所有引用的程序集
            Assembly[] asd = AppDomain.CurrentDomain.GetAssemblies(); //Assembly  添加using
            foreach(Assembly a in asd)
            {
                Console.WriteLine(a.FullName+"\r\n");            
            }
            Console.ReadKey();
        }
    }
}

生成的程序集如下;
这里写图片描述
产生的问题:

可以看到生成的程序集非常的多,模板每一次,有新的变量添加(页面内容的添加,就会重复编译,动态生成多个的程序集),大量程序集的影响网站的打开速度的性能

解决办法:给模板页取个别名”缓存名字“

using RazorEngine;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;

namespace Razor解密
{
    class Program
    {
        static void Main(string[] args)
        {
            /*
            string cshtml = File.ReadAllText(@"C:\Users\Administrator\Desktop\ceshi\Web2\Web2\Razor.cshtml");
             */

           /*
            for (int i = 0; i < 5; i++)
            {

                //给要解析模板文件cshtml一个别名字"缓存名",c1
                //这次一旦编成功后,下次如果是再次编译这个相同的模板文件cshtml的话,就让RazorEngine引擎来转换c1好了
                string html = Razor.Parse(cshtml, null, "c1");
                //为了好理解,可以给这个cshtml相同的模板文件再起个别的缓存名字"c2"
                //
            }
            */

            /*
            string html = Razor.Parse(cshtml, null, "c1");
            Razor.Parse(cshtml, null, "c2");

            */
            //1.取得文件的路径
            string fullPath=File.ReadAllText(@"C:\Users\Administrator\Desktop\ceshi\Web2\Web2\Razor.cshtml");


            for (int i = 0; i < 10; i++)
            {
                //2.读出模板中的内容
                string cshtml = File.ReadAllText(fullPath);
                //取文件的全路径+文件修改的时间做cacheName不一样(每一次文件的编译的时候用的都是同一个缓存的名字)
                //修改时间保证相同文件做了内容修改之后的cacheName不一样(也可以用文件内容的MD5值,)
                string cacheName = fullPath + File.GetLastWriteTime(fullPath);
                string html = Razor.Parse(cshtml, null, cacheName);
                Console.WriteLine(html);
            }

            //找到本程序中所有引用的程序集
            Assembly[] asd = AppDomain.CurrentDomain.GetAssemblies(); //Assembly  添加using
            foreach(Assembly a in asd)
            {
                Console.WriteLine(a.FullName+"\r\n");            
            }
            Console.ReadKey();
        }
    }
}

取了一个别名字后动态程序集生成的效果

发现只有一个了
这里写图片描述

给同一个模板页取两个不同的别名字后效果

这里写图片描述

给同一个模板页取加上时间的别名字后效果

这里写图片描述
这里写图片描述

版权声明:本文为博主原创文章,未经博主允许不得转载。

VTemplate模板引擎的使用--高级篇

在网站中,经常会有某个栏目的数据在多个页面同时使用到。比如新闻网站或电子商务网站的栏目列表,几乎在很多页面都会显示栏目导航。对于这种多个页面同时使用到的“数据区”在ASP.NET Web Form开发...
  • my98800
  • my98800
  • 2016年03月21日 08:51
  • 453

【搬运外国同行文章】在非网页程序里使用razor模板引擎

【前言】近日研究代码生成,急需一个模板引擎,找到了一篇外国同行的文章,里面有如何在其他环境里面使用razor而且详细说明了原理,非常好,本人虽然英语战力 Hosting the Razor Engi...
  • cdnight
  • cdnight
  • 2013年06月21日 22:16
  • 2566

在winform里面如何使用razor模板引擎?

某日,需要搞一个代码生成器,但是 vs2010下面没有什么好用的模板引擎--需要有智能提示,需要强类型识别,nvelocity不错,但是没有智能提示,手写很痛苦--我可是用castle写mvc,用nv...
  • cdnight
  • cdnight
  • 2013年06月21日 20:55
  • 2728

Razor模板引擎

欢迎使用Markdown编辑器写博客本Markdown编辑器使用StackEdit修改而来,用它写博客,将会带来全新的体验哦: Markdown和扩展Markdown简洁的语法 代码块高亮 图片链接和...

[译]Razor内幕之模板

Razor中的内联模板特性并没有被广泛讨论,但是它提供了将内联模板作为方法参数的能力。现在只有asp.net页面中的Grid helper使用了内联模板,也并没有很多关于如何创建自己的模板帮助类的文档...

MVC Razor模板引擎

@RenderBody、@RenderPage、@RenderSection及Html.RenderPartial、Html.RenderAction说明一、Views文件夹 -> Shared文件夹...
  • WuLex
  • WuLex
  • 2017年04月05日 16:31
  • 421

Razor模板引擎工作原理及怎么调用外部方法演示

工作原理:RazorEngine引擎就是将cshtml模板文件进行了字符串的拼接,然后,再封装为一个程序集。。。再通过一般处理程序,进行调用。。下面来封装一个方法。来简化上一节内容的操作; 1.获...

理解模板引擎Razor 的原理

Razor是ASP.NET MVC 3中新加入的技术,以作为ASPX引擎的一个新的替代项。简洁的语法与.NET Framework 结合,广泛应用于ASP.NET MVC 项目。Razor Pad是一...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Razor模板解密
举报原因:
原因补充:

(最多只允许输入30个字)