.NET Core MVC页面更改后未刷新

234
我正在构建一个.NET Core MVC项目,最新版本为2.2。当我修改CSHTML文件并刷新页面时,浏览器没有反映我的更改,必须重新启动项目才能看到更改。这个问题已经存在一段时间了,所以我不确定是哪个更改导致了这个问题。
我尝试了使用Chrome的“清空缓存和硬重载”以及其他浏览器,但都没有效果。在Windows和Mac上使用Visual Studio for Mac和VS Code均出现此问题。
在默认的.Net Core项目中,它正常工作,因此一定是我项目中的某些更改导致的。我想知道应该从哪里开始调试此问题?我已经尝试将Startup.csProgram.cs中几乎所有内容注释掉,但仍然无法解决问题。

我遇到了你在下面提到的同样的MissingMethodException... 你最后解决了吗?如果是这样,能否请你回答一下你的问题? - IEnjoyEatingVegetables
适用于Rider和/或Razor类库(RCL),请参见此答案。 - Uwe Keim
哇,没想到会这样。真是个糟糕的事情。两年后只有147次点赞。让人想知道谁在使用.NET Core构建应用程序... - dpant
请确保您确实查看了正确的代码区域。我因为这个愚蠢的问题浪费了许多时间,最后发现它实际上正在更新我的代码。 - Post Impatica
17个回答

443
在ASP.NET Core 3.0及更高版本中,RazorViewEngineOptions.AllowRecompilingViewsOnFileChange不再可用。 在应用程序运行时刷新视图并不起作用,为了解决这个问题,可以按照以下步骤: 1. 将Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation NuGet包添加到项目中。 2. 在Startup.cs中添加以下内容:
services.AddControllersWithViews().AddRazorRuntimeCompilation();

这里是完整的解释,供好奇者参考。


8
这个方法在我的Mac和ASP.NET Core 3.1上运行良好。 - user3071284
4
谢谢这个提示,对我在 .Net Core 3.1.2 上起作用。 - jawa
68
哇塞!在.NET工作了15年,以前很容易。现在用.NET Core工作一天,似乎一切都崩溃了。 而且说真的 - 谁决定把HTML默认编译并在运行时不可更改,然后让开发人员去寻找解决方案? - Jason Snelders
4
谢谢!正在使用 .Net 5.0 进行开发! - Ignacio
3
使用.NET 6和VS2022,这也非常出色! - Oded Dahari
显示剩余19条评论

104
似乎在ASP.NET Core 2.2中进行了更改(但我找不到有关此更改的任何公告)。如果未明确运行在“开发”环境中,则Razor视图将被编译,并且您将无法看到对.cshtml所做的任何更改。但是,您可以通过在Startup类中使用一些配置来关闭它。
services.AddMvc().AddRazorOptions(options => options.AllowRecompilingViewsOnFileChange = true);

对于 ASP.NET Core 3.0 及以上版本,请参阅 Alexander Christov 的回答


2
谢谢。然而,当我启用此功能并更改HTML后刷新时,出现以下异常:Microsoft.CodeAnalysis.CSharp.Symbol.Microsoft.CodeAnalysis.ISymbol.GetAttributes()``` 您知道这个异常是什么意思吗?所有其他页面都可以正常加载。只有在编辑文件并刷新后才会出现此错误。 - kevskree
3
这对我很有效。为了根据环境进行设置,请在Startup方法中添加IHostingEnvironment并将其保存在属性中。然后使用类似于services.AddMvc().AddRazorOptions(options => options.AllowRecompilingViewsOnFileChange = _env.IsEnvironment("MyEnvironment"));的代码。 - KuriosCurious
1
谢谢,它起作用了。然而,我认为微软不正式宣布这样的重大更改相当尴尬和愚蠢。 - Code_Worm
@kevskree 我也遇到了同样的问题。 - IEnjoyEatingVegetables
1
@Mayank Gupta:请查看亚历山大·克里斯托夫(Alexander Christov)在以下答案(https://dev59.com/LVQJ5IYBdhLWcg3wiWeb#57637903)中的回答。他的答案对我有效(3.1)。 - Sandor Drieënhuizen
显示剩余2条评论

71

我刚使用最新的ASP.NET MVC Core 3.1模板创建了一个新项目,并修改了以下内容以启用调试时的运行时重新编译:

引用NuGet包 - Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation

Startup.cs - ConfigureServices(IServiceCollection services)原本是:

// stuff...

services.AddControllersWithViews();

// more stuff...

NOW:

// stuff...

var mvcBuilder = services.AddControllersWithViews();

#if DEBUG
    mvcBuilder.AddRazorRuntimeCompilation();
#endif

// more stuff...

4
这是最佳答案,即使没有阅读亚历克斯发布的文章也可以理解,但是该文章确实值得一读。 - jon.r

48

除了Alexander Christov的回答之外,自ASP.NET Core 3.1起,您可以在开发环境中启用视图编译,无需更改Startup文件

  1. 安装Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation NuGet包。
  2. 设置以下环境变量(例如通过launchSettings.json中的environmentVariables部分):
    • ASPNETCORE_ENVIRONMENT为“Development”。
    • ASPNETCORE_HOSTINGSTARTUPASSEMBLIES为“Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation”。

4
这个回答应该被接受;它能够实现所需的功能,而无需修改启动文件。 - Tom Regan
1
如果您将一个项目从.NET 5升级到.NET 6,那么您还需要将Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation从v5.x更新到v6.x,否则您将无法在制作更改时查看Razor视图或页面。 - Tommy Williams
你好... 我也遇到同样的问题,但是尝试了并没有成功。不良的副作用是所有带重音符号的元音在浏览器中都显示不正常。如果我从launchSettings.json文件中移除 Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation ,重音符号出现正确。看来这个视图编译问题似乎没有解决方案。 - jstuardo

21

首先使用NuGet Manager安装Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation 然后在startup.cs中添加以下代码

services.AddRazorPages().AddRazorRuntimeCompilation();

Net6.0同样有效。

builder.Services.AddRazorPages().AddRazorRuntimeCompilation();

14

针对使用Net Core 3.0或以上版本的用户

  1. 转到工具 → Nuget程序包管理器 → 管理解决方案的Nuget程序包

  2. 切换到浏览选项卡以从互联网浏览

  3. 搜索 RuntimeCompilation,点击 Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation

  4. 将其安装在您打算使用的项目上(当前稳定版本)

  5. 打开 Startup.cs 文件

  6. 进入 ConfigureServices 方法

  7. 添加以下行:services.AddControllersWithViews().AddRazorRuntimeCompilation();

  8. 完成

重新运行并查看。现在您可以刷新您的视图或页面。


13
你只需要添加这个:
services.AddControllersWithViews();

ConfigureService() 方法。

请注意,以下代码在 ASP.NET Core 3.1 中不可用:

services.AddControllersWithViews().AddRazorRuntimeCompilation();

9
您需要安装NuGet包才能使其工作。包名为Microsoft.AspNetCore.Mvc.Razor.Runtime。 - Mayank Gupta

5
我在开发一个 .NET 6 MVC Web 应用时遇到了同样的问题。我从 NuGet 包管理器安装了 Microsoft.AspNetCore.Mvc.Razor.Runtime.Compilation 然后在之后添加了 .AddRazorRuntimeCompilation();
builder.services.AddControllersWithViews();

因此它看起来像这样

构建器.services.AddControllersWithViews().AddRazorRuntimeCompilation();

然后它起作用了!

希望这可以帮助到您。


5
使用 .net core 2.2 运行应用程序时,使用命令 dotnet watch run,每次更改后项目都会重新启动。

5

当视图位于单独的项目中时,以下内容可以帮助我。

if(HostingEnvironment.IsDevelopment()){ // only in development (optional)
    services.AddMvc().AddRazorOptions(o => {
        o.FileProviders.Add(new PhysicalFileProvider(PATH_TO_PROJECT));
    });
}

1
这是我在使用 Razor 类库时唯一有效的答案。干杯! - Sipke Schoorstra
使用Core 3.1按照这些指示安装了版本3.1.16,但出现了错误:“IMVcBuilder”不包含“AddRazorRuntimeCompilation”的定义,并且找不到接受类型为“IMVcBuilder”的第一个参数的扩展方法“AddRazorRuntimeCompilation”。 - Clarence

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接