关于Razor中的cacheName的问题

为什么使用cacheName

使用cacheName主要是考虑到Razor.Parse()每解析一次都会动态创建一个程序集,如果解析量很大,就会产生很多程序集,大量的程序集调用会造成程序非常慢。

举个栗子:

如果编译1000次,编译速度就会很慢。

static void Main(string[] args)
        {

            string cshtml = File.ReadAllText(@"E:\百度云同步盘\Study\Net_ASP.NET\Web基本原理\RazorCacheNameTest\HTMLPage1.cshtml");
            for (int i = 0; i < 1000; i++)
            {
                string html = Razor.Parse(cshtml);
            }

            Assembly[] asms = AppDomain.CurrentDomain.GetAssemblies();
            foreach (Assembly asm in asms)
            {
                Console.WriteLine(asm.FullName+"\r\n");
            }
            Console.ReadKey();
        }

如何解决这个问题

使用Razor.Parse()时,带上cacheName参数。

指定一个cacheName叫cc,下次Parse()解析时就不会重新编译了(除非cshtml内容修改,那么cacheName名也要重新命名,让Parse()解析新文件)

for (int i = 0; i < 1000; i++)
            {
                //如果调用100次,使用下面方式就会创建很多程序集,性能很低
                string html = Razor.Parse(cshtml);
                //解析的cshtml文件我给的一个“缓存名”是cc,这次一旦编译成功
                //下次再让你Parse() cc就不用重复编译了,速度会非常快,除非cshtml内容修改
                Razor.Parse(cshtml, null, "cc");
            }

怎么确定cacheName来表示文件已修改呢?

有两种方式,一种就是文件全路径+文件修改时间,还可以根据cshtml文件的MD5值。

for (int i = 0; i < 10; i++)
            {
                string cshtml = File.ReadAllText(fullPath);
                string cacheName = fullPath + File.GetLastWriteTime(fullPath);//文件全路径+文件上一次被修改时间
                string html = Razor.Parse(cshtml,null,cacheName);
                Console.WriteLine(html);
                Console.ReadKey();
            }

每当cshtml文件被修改,cacheName的值就会改变,Parse()根据cacheName值判断是否重新编译。假如测试过程中对cshtml文件做了三次修改,最终会生成三个程序集,如果cshtml文件未修改,最后只有一个程序集。

时间: 2024-11-13 05:53:54

关于Razor中的cacheName的问题的相关文章

Asp.Net Core-几行代码解决Razor中的嵌套if语句

MVC开发中,经常会遇到在razor中插入简单的逻辑判断. @if (clientManager.IsAdmin) { if (!Model.Topic.Top) { <a asp-action="Top" asp-controller="Topic" asp-route-id="@Model.Topic.ID" class="btn btn-default btn-xs" title="置顶">

ASP.NET MVC 3和Razor中的@helper

ASP.NET MVC 3支持一项名为“Razor”的新视图引擎选项(除了继续支持/加强现有的.aspx视图引擎外).当编写一个视图模板时,Razor将所需的字符和击键数减少到最小,并保证一个快速.通畅的编码工作流. 与大部分模板的语法不同,在Razor的帮助下,您不需要中断代码编写,仅仅为了在HTML中标注服务器端代码块的开始和结束.代码分析器足够聪明,它能够从你的代码里推断出是否为服务器端代码.这种更加简洁.富有表现力的语法更加干净,输入也更快速,有趣. 今天的博文涵盖了Razor的一项很多

(转)ASP.NET MVC 3和Razor中的@helper 语法

转自:http://kb.cnblogs.com/page/102191/ ASP.NET MVC 3支持一项名为“Razor”的新视图引擎选项(除了继续支持/加强现有的.aspx视图引擎外).当编写一个视图模板时,Razor将所需的字符和击键数减少到最小,并保证一个快速.通畅的编码工作流. 与大部分模板的语法不同,在Razor的帮助下,您不需要中断代码编写,仅仅为了在HTML中标注服务器端代码块的开始和结束.代码分析器足够聪明,它能够从你的代码里推断出是否为服务器端代码.这种更加简洁.富有表现

Razor 中的@helper 与 @function 用法

@helper : 可以有返回值,也可以没有返回值 @function :需要有返回值 可以将View中公共部分的代码抽取出来,变成一个独立的方法 公共部分 view 抽出的公共部分的view 必须放在App_Code目录下,文件名 xxx.cshtml . 文件名就是类名称 CommonUI.cshtml 无返回值 @helper ShowCustomerInfo(Customer customer) { <ul> <li>@customer.CompanyName</li

Asp.Net Razor中的Consistent Layout

有意义的参考:http://www.asp.net/web-pages/tutorials/working-with-pages/3-creating-a-consistent-look Asp.net是怎样解决Consistent Layout问题的?是通过引入以下几个概念并提供相应的机制解决的: Content Blocks,内容块,是包含html内容的文件,可以“插入”到其他页面中,一般不能直接访问,类似于Web Form中用户控件的概念: Layout Pages,布局页面,是包含htm

Razor 中的@rendersection

在使用布局页时,可以指定页面中某处的渲染,具体的用@rendersection来做.如在布局页中要渲染一段自定义的脚本, @RenderSection("scripts", required: false),第一个参数代表该section的名称,第二个参数指明该section是否是必须的.在视图中实现该section时,@section scripts{ 实现的代码}.和正常的脚本一样 布局页中的声明 视图中的实现

在Razor中如何引入命名空间?(&quot;import namespace in razor view&quot;) 【转】

原文链接 找了半天,原来如此: 在aspx中: <%@ Import Namespace = "Martian.Areas.SFC.Models" %><%@ Import Namespace = "Martian.Areas.SFC.Tools" %> 在cshtml中: @using Martian.Areas.SFC.Models@using Martian.Areas.SFC.Tools 个人现在喜欢的风格是加上:,因为这样看起来和C

Razor中HtmlEncodeString和Raw方法

HtmlEncodeString和Raw的使用 1,RazorTest类: public static HtmlEncodedString Test1() { //HtmlEncodedString对字符串做了htmlencode,比如将将 < 转义成< return new HtmlEncodedString("<input type='text' value='请输入'/>"); } public static RawString Test2() { ret

MVC Razor中 如何截断字符串

有时候显示的内容过长,使用MVC编程时,如何截断显示的内容呢.我知道你肯定有很多办法这样做的,但是在学习MVC时,还是使用一些新的办法做吧> Razor 标记语法编程. 1 @helper Truncate(string input,int length) 2 { 3 if(input.length<=length) 4 { 5 @input 6 7 }else 8 { 9 @input.SubString(0,length)<text>...<text> 10 11