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

C#asp.net CoreRazor Pagesasp.net Core-3.0

C# Problem Overview


According to the documentation, Razor views should, by default, recompile on change on local environments for ASP.NET Core 3.0.

However, my project doesn't do this locally. If I change a view and refresh when I'm debugging locally, the change is not reflected. I have to stop the solution, re-run, and then see the change.

I am doing this on a default ASP.NET Core Web Application template on Visual Studio 2019 with ASP.NET Core 3.0.0 Preview 2 using Razor pages. Any idea if I need to change settings to enable this feature?

UPDATE NOV 2019 FOR 3.0 FULL RELEASE:

This question still gets a lot of views. A few answers have cited to add

services.AddControllersWithViews().AddRazorRuntimeCompilation(); 

To your ConfigureServices() function in Startup.cs after adding the Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation NuGet package. In my case, I am only using Razor Pages, so I don't call AddControllersWithViews(). Instead, this worked for me:

services.AddRazorPages().AddRazorRuntimeCompilation();

C# Solutions


Solution 1 - C#

For ASP.NET Core 3 release version:

   services.AddControllersWithViews().AddRazorRuntimeCompilation();

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

It can also be enabled conditionally only for local development, quoted from the 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
    }

Solution 2 - C#

OK it looks like it's not supported yet :(

> 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.

You can read more about the issue here https://github.com/aspnet/Announcements/issues/343

Applications that require runtime compilation or re-compilation of Razor files should:

  • Add a reference to the Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation package. It'll be available as part of the 3.0.0-preview3 release.
  • Update the application's ConfigureServices to include a call to AddMvcRazorRuntimeCompilation:

Solution 3 - C#

To get runtime view compilation back in ASP.NET Core 3

  1. Reference Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation
  2. Call services.AddMvc().AddRazorRuntimeCompilation()
  3. Remove Microsoft.VisualStudio.Web.CodeGeneration.Design if there's a version mismatch on the Microsoft.CodeAnalysis.Common package

Solution 4 - C#

Runtime compilation is enabled using the Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation package. To enable runtime compilation, apps must:

  1. Install the Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation NuGet package.

  2. Update the project's Startup.ConfigureServices method to include a call to AddRazorRuntimeCompilation:

services
    .AddControllersWithViews()
    .AddRazorRuntimeCompilation();

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

Solution 5 - C#

To get runtime Razor Views Compilation back in ASP.NET Core 3.1:

  1. Install the Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation NuGet package.
  2. Update the project's Startup.ConfigureServices method to include a call to AddRazorRuntimeCompilation.
  3. services.AddRazorPages().AddRazorRuntimeCompilation();

Razor file compilation in ASP.NET Core 3.1

Solution 6 - C#

Step 1: Install the below package from NuGet Package Manager for Solution.

Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation

Step 2: Add the below code in ConfigureServices of Startup.cs file

services.AddControllersWithViews().AddRazorRuntimeCompilation();

Save the page and then refresh the client browser.

If you are using Razor then add the code for services.AddRazorPages().AddRazorRuntimeCompilation();

Solution 7 - C#

In .NET Core 3.1, you need disable generation of the views.dll file.

  1. Add the below code to your .csproj file (in the root of your project):

    <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. Install the below package from the NuGet Package Manager for the Solution.

    Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation
    
  3. Add the below code to the ConfigureServices method of your Startup.cs file:

    services.AddMvc().AddRazorRuntimeCompilation();
    

    Or

    services.AddControllersWithViews().AddRazorRuntimeCompilation();
    

    Or

    services.AddRazorPages().AddRazorRuntimeCompilation();
    

After this, publish again and run it. It will work.

Solution 8 - C#

Just an added note -- you may want to only conditionally enable this runtime compilation, so that the published output:

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

Conditionally enable runtime compilation

Solution 9 - C#

Simpliest way to configure Runtime Compilation for Local Development only is to update launch profiles in launchSettings.json. This method requires no code changes to configure a project which is running locally (it will not affect your production).

See the official documentation:

> 1. Install the Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation NuGet package. > 1. 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".

Example:

{
  "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"
      }
    }
  }
}

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
Questiontarun713View Question on Stackoverflow
Solution 1 - C#RaulandView Answer on Stackoverflow
Solution 2 - C#Lukáš KmochView Answer on Stackoverflow
Solution 3 - C#Dmitry PavlovView Answer on Stackoverflow
Solution 4 - C#kevicView Answer on Stackoverflow
Solution 5 - C#Naman UpadhyayView Answer on Stackoverflow
Solution 6 - C#psuneel127View Answer on Stackoverflow
Solution 7 - C#Ali RasouliView Answer on Stackoverflow
Solution 8 - C#BryanCassView Answer on Stackoverflow
Solution 9 - C#Siarhei KavaleuskiView Answer on Stackoverflow