【问题标题】:ASP.NET MVC - Update Pre-compiled Razor View file Live in ProductionASP.NET MVC - 在生产中更新预编译的 Razor 视图文件
【发布时间】:2013-02-27 11:23:43
【问题描述】:

我想知道以下是否可行:

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

【问题讨论】:

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


    【解决方案1】:

    是的,您可以这样做。视图引擎会将每个目录下的所有文件重新编译成单独的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 thatMvcBuildViews` 会运行此构建后事件,其作用与您要点击应用程序所需的每个文件一样。

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

    为了获得最佳性能,我推荐RazorGenerator precompiler。这实际上将 cshtml 文件嵌入到您的主 DLL 中,这根本不是 MvcBuildViews 所做的。而且速度更快。

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


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

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

    那么你就不用寻找完整的路径了。

    【讨论】:

    • 很好的答案。并不是要劫持您的答案(它提供的信息非常丰富),但我来自 Java/JSP 背景并且想知道,Razor 视图是否被编译成 .cs 文件(例如 JSPs->Servlets->class 如何编译) ,还是直接进入 MSIL?
    • 它们被编译成 .cs,然后是 MSIL。如果您查看 C:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET 文件,您会发现带有一堆 WriteLines 的 .cs 文件。如果您使用我引用的预编译器,它们位于您的项目文件夹中的Obj\CodeGen 中,并且更容易找到
    【解决方案2】:

    是的,你可以。

    cshtml 文件不会像项目的其他部分一样被编译。因此,您可以在项目之外更改它们。

    【讨论】:

    • hmm...为了预编译,我们打开 .csproj 文件中的设置 true。那么当我稍后更改 cshtml 文件而不构建时会发生什么?我认为剃刀文件会在幕后转换为 .cs 文件,并且预编译步骤会预先为您完成这部分工作。那么如果我们稍后更新 cshtml 文件,运行时是否会重新生成 .cs 文件?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-21
    • 2017-07-22
    • 2010-09-27
    • 1970-01-01
    • 2023-03-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多