在传统的asp.net webForm 开发里,在发布时,如果选择预编译,就会自动将所有的aspx 文件编译,在发布后的目录里,就看不到aspx的源代码了,同时因为是预编译的,所以每个页面打开速度都挺快的。

而在MVC里,默认就不是这样了。

MVC在发布以后,我们熟知的这些cshtml文件会随着发布,一起发布到发布后的目录里。你源代码过去咱也不说什么了,但是,却没有把这些cshtml文件预编译为二进制文件。就会导致当我们每打开一个新页面时,第一次总会慢一些(这个是第一次是指,整个网站的这个页面被用户的第一次访问,而不是仅仅针对你一个人来说哦)。

举个例子来说,比如我们访问  /Activity/Page/1

对应的controller  是 Activity,action是Page

那么,当我们第一次访问这个 action时,.NET 会把 这个 Activity controller 对应的view 目录里的所有view(cshtml文件 ,实际目录其实就是 /Views/Activity/*.cshtml 这些文件)编译成一个dll文件(其实是先转成.cshtml.cs,然后再编译的),然后再加载这个dll进行。所以,第一次,总会慢一些,再快的服务器也得稍微等那么一下下,即使你负载均衡又怎么样?

当第二次再访问这个action时,.NET 会自动判断是否已编译过,如果已编译就直接调用执行,否则再重新编译一次(文件如果发生了变更会重新再编译一次)。

这时候,我们已经访问过 /Activity/List/Page/1,在页面里我们找到一个“活动”点进去,跳转到 /Activity/Detail/2。这个时候 会不会再要编译一次呢?不会了,因为在访问 /Activity/Page/1 的时候,已经把 "/Views/Activity/*.cshtml"这些文件都编译过了。.NET的这些cshtml编译策略是把一个目录下的所有cshtml文件都编译一遍,合并输出到一个dll文件里。

这块说明,请参考http://www.cnblogs.com/artech/archive/2012/09/04/razor-view-engine-01.html

我解释的不够好。

---------------------------------------------------------------------

那么,我们如何在发布的时候,就将项目工程里的所有cshtml都一次性编译好呢。

使用 "RazorGenerator.MsBuild",可以直接通过Nuget安装。(链接附在最后)

安装好以后,在编译之前,它会将项目工程里声明引入的cshtml文件都转成 {viewPageName}.cshtml.cs 文件,默认是输出到 "obj/CodeGens"目录下面;然后项目编译的时候就会把这些*.cshtml.cs编译,并合并到主程序集的dll文件 里,比如你的项目名是 RazorBuildDemo,那么生成的dll 就是RazorBuildDemo.dll, 所有的*.cshtml.cs 编译也都会合并到RazorBuildDemo.dll 里。

网站发布到生产环境以后,除了网站第一次打开稍微慢一些(网站初始化过程),其他时候打开各个页面,是不是要比之前的快一些了?

当然,这个东西的好处不仅仅是 预编译,还可以自动在发布时检查页面里的错误。因为是预编译页面,所以在发布时,每个页面都会进行处理,这样就可以自动检查页面里的错误代码(因为必须保证编译通过才行),省得有些地方改了,而又没去测,导致之前可能出现的低级错误。

这家其实还有几个这方面的工具,大家可以去看看。

之前一直搜这方面的工具,可惜一直都没有好的发现,有几个都是RazorGenerator.MVC 这个工具,虽然是同一家出的,但是这个要给每个页面都配置一下,好像新版的不用每个页面都设置这么麻烦,没去细研究,但是我想总没有 RazorGenerator.MsBuild 这个好用吧?我就喜欢这种傻瓜式的,用起来方便。所以我们自己做东西也要奔着傻瓜式做,让用户用着简单,可以有复杂的功能,但是上手,一定要简单,不然实在太难受了。我特么的就是一个懒人。

今天发现了这个好东西,不敢独享,我想一定要分享出来,给有需要的人。(我看这个RazorGenerator.MsBuild的安装数还是很多的)。

在百度我专门搜“RazorGenerator.MsBuild”搜的都是几个国外的英文站,国内就搜出来一个,也是博客园的,不过有点早,说明也比较浅一些。难道做ASP.NET MVC 开发的人少?

唉,自己技术圈子小,这些知识知道的还是太少,蛋疼!

所以,推荐大家,以后建MVC项目,最好把这个包添加到项目中。

在此,必须安利一下这个好东西“RazorGenerator.MsBuild”。

asp.net MVC开发,你值得拥有!

https://github.com/RazorGenerator/RazorGenerator

安利一个MVC的好东西,RazorGenerator.MsBuild,可以自动编译cshtml文件的更多相关文章

  1. ASP.NET MVC中切换模板页(不同目录的cshtml文件)

    看来以后建立一个父类控制器还是有必要的... using System;using System.Collections.Generic;using System.Linq;using System. ...

  2. 创建第一个MVC

    创建第一个MVC(asp.net)和默认路由设置 Asp.net的MVC已经出到了4.0,我用的是visual studio2013,接下来努力学下MVC,学之前的话我建议大家先去学下三层(分别是DA ...

  3. Pro ASP.NET MVC –第二章 第一个MVC程序

    学习一个软件开发框架的最有效的方式就是了解并使用它.在本章,你将会创建一个简单基于ASP.NET MVC Framework的数据-实体应用程序.我们会该程序划分成若干小块,每次介绍一个部分,以便你能 ...

  4. 使用 Netty 实现一个 MVC 框架

    NettyMVC 上面介绍 Netty 能做是什么时我们说过,相比于 SpringMVC 等框架,Netty 没提供路由等功能,这也契合和 Netty 的设计思路,它更贴近底层.下面我们在 Netty ...

  5. 【MVC 4】1.第一个 MVC 应用程序

    作者:[美]Adam Freeman      来源:<精通ASP.NET MVC 4> ASP.NET MVC 是微软的一个 Web开发框架,它整合了“模型—视图—控制器(MVC)”架构 ...

  6. 创建一个MVC解决方案,添加一个控制器后,运行程序报错:”/"未找到服务器

    1.创建一个MVC项目,如图

  7. 老司机教你用原生JDK 撸一个 MVC 框架!!!

    其实 Spring MVC 是一个基于请求驱动的 Web 框架,并且也使用了前端控制器模式来进行设计,再根据请求映射规则分发给相应的页面控制器进行处理,具体工作原理见下图. 在这里,就不详细谈相关的原 ...

  8. 安利一个vps,7美元/年。

    黑色星期五.给大家安利一个vps,7美元/年.配置如下:2 个虚拟化 CPU 2 GB (2048 MB) 专属内存 50 GB RAID-10 受保护硬盘存储 3000 GB (3TB) 月流量 1 ...

  9. 创建第一个MVC应用程序

    整个国庆期假,Insus.NET没有出门,在家静心修炼MVC.这意味着Insus.NET将来的日子里会以MVC为学习,开发,应用作为重点,不过现在才开始踏出第一步...... 路慢慢...... 下载 ...

随机推荐

  1. 【视频演示】FireBase链接已有应用&实时数据库的配置与使用

    全程无编辑,一镜到底,一帧未减,带上犯傻的时间全部不到31分钟:Firebase链接与基础功能使用如此之简单,跟我一起动手,从零开始链接Firebase吧~注意: 输入声源为笔记本自带麦克风,所以风扇 ...

  2. Dedecms自定义表单后台列表展现方式更改

    Dedecms有自定义表单功能,方便我们收集用户信息.个人通常喜欢拿这个功能做问卷调查,在线留言等功能.但是如果使用过这个功能的朋友就会知道,Dedecms自定义表单后台列表展现方式并不好看. 上面就 ...

  3. 测试cookie的读写

    js文件使用utf8编码 <p><img id="img" onclick="javascript:var s=document.createEleme ...

  4. CSS样式--实际开发总结

    1.   div 嵌套,子div中内容超出范围可以设置: display:inline-block; overflow:auto 即可让子div中出现滚轴 2.   让div中内容垂直方向居中 设置: ...

  5. MatLab/HR

  6. apache2.2 搭载本地中转服务器

    android手机微信里点击本地链接=>apache2.2服务器响应--- 翻译网址至本地目标服务器 ---目标服务器响应,返回结果给微信浏览器. 运行环境 微信版本6.3.8 手机 MIUI6 ...

  7. Xcode中创建文件夹

    如果在xcode工程中new group,只是在视觉效果上分好了几个文件夹,方便分类管理,但在finder中并不会创建新的文件夹,在硬盘目录还是所有文件都并列在一个文件夹内,更恶心的是当你重新打开工程 ...

  8. code complete part1

    最近在看code complete,学习了一些东西,作为点滴,记录下来. 关于类: 类的接口抽象应该一致 类的接口要可编程,不要对类的使用者做过多的假设.不要出现类似于:A的输入量一定要大于多少小于多 ...

  9. 解决Type 'UnityEngine.Component' does not support slicing

    unity从4.x升级到5.x后部分脚本的编译错误 将animation改成GetComponent.<Animation>()

  10. Linux软raid创建

    RAID: HBA:基于主机的适配器 RAID:Redundent Array of Inexpensive Disks 廉价磁盘阵列 Independent       独立磁盘阵列 Level:仅 ...