.NET Core 3.0:Razor 视图不会在更改时自动重新编译

.NET Core 3.0: Razor views don't automatically recompile on change

根据 the documentation,默认情况下,Razor 视图应根据 ASP.NET Core 3.0 的本地环境更改重新编译。

但是,我的项目不会在本地执行此操作。如果我在本地调试时更改视图并刷新,则不会反映更改。只好停止解决,重新运行,再看变化

我在 Visual Studio 2019 的默认 ASP.NET 核心 Web 应用程序模板上使用 ASP.NET 核心 3.0.0 预览版 2 使用 Razor 页面执行此操作。知道我是否需要更改设置以启用此功能吗?

2019 年 11 月更新 3.0 完整版本:

这个问题还是有很多人看的。引用几个答案补充

services.AddControllersWithViews().AddRazorRuntimeCompilation(); 

在添加 Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation NuGet 程序包后 Startup.cs 中的 ConfigureServices() 函数。就我而言,我只使用 Razor Pages,所以我没有调用 AddControllersWithViews()。相反,这对我有用:

services.AddRazorPages().AddRazorRuntimeCompilation();

好的,看起来还不支持:(

Runtime compilation removed As a consequence of cleaning up the ASP.NET Core shared framework to not depend on Roslyn, support for runtime compilation of pages and views has also been removed in this preview release. Instead compilation of pages and views is performed at build time. In a future preview update we will provide a NuGet packages for optionally enabling runtime compilation support in an app.

您可以在此处阅读有关该问题的更多信息https://github.com/aspnet/Announcements/issues/343

需要运行时编译或重新编译 Razor 文件的应用程序应该:

  • 添加对 Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation 包的引用。它将作为 3.0.0-preview3 版本的一部分提供。
  • 更新应用程序的 ConfigureServices 以包含对 AddMvcRazorRuntimeCompilation 的调用:

要在 ASP.NET Core 3

中恢复运行时视图编译
  1. 引用Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation
  2. 致电services.AddMvc().AddRazorRuntimeCompilation()
  3. 如果 Microsoft.CodeAnalysis.Common
  4. 上存在版本不匹配,请删除 Microsoft.VisualStudio.Web.CodeGeneration.Design

对于ASP.NET Core 3 发布版本:

   services.AddControllersWithViews().AddRazorRuntimeCompilation();

https://docs.microsoft.com/en-us/aspnet/core/mvc/views/view-compilation?view=aspnetcore-3.0

也可以有条件地只为本地开发启用,引用自link:

Runtime compilation can be enabled such that it's only available for local development. Conditionally enabling in this manner ensures that the published output:

Uses compiled views.
Is smaller in size.
Doesn't enable file watchers in production.

   public Startup(IConfiguration configuration, IWebHostEnvironment env)
    {
        Configuration = configuration;
        Env = env;
    }

    public IWebHostEnvironment Env { get; set; }
    public IConfiguration Configuration { get; }

    public void ConfigureServices(IServiceCollection services)
    {
        IMvcBuilder builder = services.AddRazorPages();

#if DEBUG
            if (Env.IsDevelopment())
            {
                builder.AddRazorRuntimeCompilation();
            }
#endif
    }

使用 Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation 包启用运行时编译。要启用运行时编译,应用必须:

  1. 安装 Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation NuGet 包.

  2. 更新项目的 Startup.ConfigureServices 方法以包含一个 致电 AddRazorRuntimeCompilation:

services
    .AddControllersWithViews()
    .AddRazorRuntimeCompilation();

https://docs.microsoft.com/en-us/aspnet/core/mvc/views/view-compilation?view=aspnetcore-3.0

要在 ASP.NET Core 3.1 中恢复运行时 Razor Views 编译:

  1. 安装 Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation NuGet 包。
  2. 更新项目的 Startup.ConfigureServices 方法以包含对 AddRazorRuntimeCompilation 的调用。
  3. services.AddRazorPages().AddRazorRuntimeCompilation();

    Razor file compilation in ASP.NET Core 3.1

只是一个补充说明——您可能只想有条件地启用此运行时编译,以便发布的输出:

  • 使用编译视图。
  • 尺寸较小。
  • 在生产环境中不启用文件观察器。

Conditionally enable runtime compilation

第 1 步:从解决方案的 NuGet 包管理器安装以下包。

Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation

第 2 步:在 Startup.cs 文件

的 ConfigureServices 中添加以下代码

services.AddControllersWithViews().AddRazorRuntimeCompilation();

保存页面,然后刷新客户端浏览器。

如果您使用的是 Razor,则添加 services.AddRazorPages().AddRazorRuntimeCompilation();

的代码

在 .NET Core 3.1 中,您需要禁用 views.dll 文件的生成。

  1. 将以下代码添加到您的 .csproj 文件(在项目的根目录中):

    <PropertyGroup>
        <TargetFramework>netcoreapp3.1</TargetFramework>
        <UserSecretsId>...</UserSecretsId>
    
        <!-- add from this line: -->
        <CopyRazorGenerateFilesToPublishDirectory>true</CopyRazorGenerateFilesToPublishDirectory>
        <CopyRefAssembliesToPublishDirectory>false</CopyRefAssembliesToPublishDirectory>
        <MvcRazorCompileOnPublish>false</MvcRazorCompileOnPublish>
        <RazorCompileOnBuild>false</RazorCompileOnBuild>
        <!-- to this line. -->
    
    </PropertyGroup>
    
  2. 从解决方案的 NuGet 包管理器安装以下包。

    Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation
    
  3. 将以下代码添加到 Startup.cs 文件的 ConfigureServices 方法中:

    services.AddMvc().AddRazorRuntimeCompilation();
    

    services.AddControllersWithViews().AddRazorRuntimeCompilation();
    

    services.AddRazorPages().AddRazorRuntimeCompilation();
    

在此之后,再次发布并运行。它会起作用。

仅针对本地开发配置运行时编译的最简单方法是更新 launchSettings.json 中的启动配置文件。此方法无需更改代码即可在本地配置 运行 项目(不会影响您的生产)。

参见the official documentation

  1. Install the Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation NuGet package.
  2. Modify the launch profile environmentVariables section in launchSettings.json:
    • Verify ASPNETCORE_ENVIRONMENT is set to "Development".
    • Set ASPNETCORE_HOSTINGSTARTUPASSEMBLIES to "Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation".

示例:

{
  "iisSettings": {
    "windowsAuthentication": false,
    "anonymousAuthentication": true,
    "iisExpress": {
      "applicationUrl": "http://localhost:57676",
      "sslPort": 44364
    }
  },
  "profiles": {
    "IIS Express": {
      "commandName": "IISExpress",
      "launchBrowser": true,
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development",
        "ASPNETCORE_HOSTINGSTARTUPASSEMBLIES": "Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation"
      }
    },
    "RazorPagesApp": {
      "commandName": "Project",
      "launchBrowser": true,
      "applicationUrl": "https://localhost:5001;http://localhost:5000",
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development",
        "ASPNETCORE_HOSTINGSTARTUPASSEMBLIES": "Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation"
      }
    }
  }
}