.NET Core 3.0: Razor views don't automatically recompile on change
C#asp.net CoreRazor Pagesasp.net Core-3.0C# 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 toAddMvcRazorRuntimeCompilation
:
Solution 3 - C#
To get runtime view compilation back in ASP.NET Core
3
- Reference
Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation
- Call
services.AddMvc().AddRazorRuntimeCompilation()
- Remove
Microsoft.VisualStudio.Web.CodeGeneration.Design
if there's a version mismatch on theMicrosoft.CodeAnalysis.Common
package
Solution 4 - C#
Runtime compilation is enabled using the Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation
package. To enable runtime compilation, apps must:
-
Install the
Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation
NuGet package. -
Update the project's
Startup.ConfigureServices
method to include a call toAddRazorRuntimeCompilation
:
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:
- Install the
Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation
NuGet package. - Update the project's
Startup.ConfigureServices
method to include a call toAddRazorRuntimeCompilation
. services.AddRazorPages().AddRazorRuntimeCompilation()
;
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.
-
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>
-
Install the below package from the NuGet Package Manager for the Solution.
Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation
-
Add the below code to the
ConfigureServices
method of yourStartup.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.
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"
}
}
}
}