ASP.NET MVC - 更新预编译的Razor View文件直播生产

时间:2013-03-12 03:42:25

标签: asp.net asp.net-mvc asp.net-mvc-3 asp.net-mvc-2 razor

我想知道以下是否可行:

  1. 通过打开visual studio中的项目设置,使用我们的MVC应用预编​​译Razor视图。
  2. 将应用部署到生产中。
  3. 然后在稍后阶段,通过覆盖生产中的现有* .cshtml文件来更新视图,而无需回收应用程序池或重新编译项目并重新部署构建。?

2 个答案:

答案 0 :(得分:7)

是的,你可以这样做。视图引擎会将每个目录中的所有文件重新编译为一个单独的DLL,并将其重新编译为像这样的文件

  

C:\ Windows \ Microsoft.NET \ Framework \ v4.0.30319 \ Temporary ASP.NET   文件\ micropedi_mvc \ d3b5b4cd \ eb219373 \ App_global.asax.ihdiifed.DLL

您可以使用ILSpyReflector打开此文件,并准确查看已编译到哪个文件。如果你有很多目录,你会看到生成了几个DLL。

Note that all that MvcBuildViews`运行此post post构建事件,就像你点击应用程序所需的每个文件一样。

<Target Name="MvcBuildViews" AfterTargets="AfterBuild" Condition="'$(MvcBuildViews)'=='true'">
   <AspNetCompiler VirtualPath="temp" PhysicalPath="$(WebProjectOutputDir)" />
</Target>

为了获得最佳性能,我建议使用RazorGenerator precompiler。这实际上将cshtml文件嵌入到您的主DLL中,这不是MvcBuildViews所做的。加上它的速度要快得多。

如果您想在生产中使用此功能,则需要将UsePhysicalViewsIfNewer中的RazorGeneratorMvcStart.cs更改为true,以便在更新视图时重新编译。


提示:如果您想要确切地找到编译cshtml文件的DLL,只需将其添加到您的页面

 <div>This file is compiled to  @this.GetType().Assembly.CodeBase</div> 

然后你会在没有找到它的情况下获得完整的路径。

答案 1 :(得分:-1)

是的,你可以。

cshtml文件不会像项目的其余部分一样进行编译。所以你可以在项目之外更改它们。