.NET Core 3.0:Razor 视图不会在更改时自动重新编译
Posted
技术标签:
【中文标题】.NET Core 3.0:Razor 视图不会在更改时自动重新编译【英文标题】:.NET Core 3.0: Razor views don't automatically recompile on change 【发布时间】:2021-11-09 16:13:26 【问题描述】:根据the documentation,默认情况下,Razor 视图应根据 ASP.NET Core 3.0 本地环境的更改重新编译。
但是,我的项目不在本地执行此操作。如果我在本地调试时更改视图并刷新,则不会反映更改。我必须停止解决方案,重新运行,然后才能看到变化。
我在 Visual Studio 2019 上的默认 ASP.NET Core Web 应用程序模板上使用 Razor 页面使用 ASP.NET Core 3.0.0 Preview 2 执行此操作。知道我是否需要更改设置以启用此功能?
2019 年 11 月更新 3.0 完整版本:
这个问题仍然有很多观点。引用了一些答案来补充
services.AddControllersWithViews().AddRazorRuntimeCompilation();
添加Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation
NuGet 包后,在Startup.cs
中的ConfigureServices()
函数中。就我而言,我只使用 Razor Pages,所以我不打电话给AddControllersWithViews()
。相反,这对我有用:
services.AddRazorPages().AddRazorRuntimeCompilation();
【问题讨论】:
.cshtml razor 视图确实会重新编译。你能仔细检查一下吗?尝试添加Test
。启动应用程序,加载页面。你应该看到“测试”。然后将其更改为Foo
。你应该看到“Foo”。 不起作用!我必须停止并启动解决方案。在此处捕获:drive.google.com/file/d/1xOWQK2SvE2dskSYRdLz9X7iEmAv7BcTN/… - 已在多台机器上尝试使用库存的 Razor Pages 模板。 你是在 mac 还是 pc 或 linux 上运行?此外,这可能是预览的问题。您可以尝试使用 asp.net core 2.x 吗? PC,Visual Studio 2019 预览版。我尝试了 2.2 并且它有效!所以在 3.0 中发生了一些变化。 我在完全更新的 .net core 3/VS 上,必须添加.AddRazorRuntimeCompilation();
谢谢!
【参考方案1】:
好的,好像还不支持:(
运行时编译被删除作为清理的结果 ASP.NET Core 共享框架不依赖于 Roslyn,支持 页面和视图的运行时编译也已被删除 预览版。而是执行页面和视图的编译 在构建时。在未来的预览更新中,我们将提供 NuGet 用于可选地启用运行时编译支持的包 应用程序。
你可以在这里https://github.com/aspnet/Announcements/issues/343阅读更多关于这个问题的信息
需要运行时编译或重新编译 Razor 文件的应用程序应该:
添加对Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation
包的引用。它将作为 3.0.0-preview3 版本的一部分提供。
更新应用程序的 ConfigureServices
以包含对 AddMvcRazorRuntimeCompilation
的调用:
【讨论】:
AddMvcRazorRuntimeCompilation
is AddRazorRuntimeCompilation
with ASP.Net Core 3.0 Preview 4【参考方案2】:
在ASP.NET Core
3 中获取运行时视图编译
-
参考
Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation
致电services.AddMvc().AddRazorRuntimeCompilation()
如果Microsoft.CodeAnalysis.Common
包上的版本不匹配,请删除Microsoft.VisualStudio.Web.CodeGeneration.Design
【讨论】:
对其他人的提示:使用 Nuget 时,勾选/选中“预发布”框。 有没有办法防止资产被部署到生产环境中?我在 PackageReference 上尝试了一些 PrivateAssets 的组合,但它似乎不起作用。 在 Core 2.2 剃须刀选项中有 FileProviders,即使没有任何重新编译也可以工作。只需编辑cshtml,瞧。在核心 3 中,此属性已被删除。 :(github.com/aspnet/AspNetCore/issues/14572 +1 因为删除 Microsoft.VisualStudio.Web.CodeGeneration.Design 包是其他地方没有提到的秘诀。 @tkburbidge 我刚刚也遇到了这个问题。奇怪的是,我有两条完全一样的线,背靠背。我删除了两者,并且可以编译。 更奇怪的是,然后我将这些行放回原处,仍然能够编译。【参考方案3】:对于 ASP.NET Core 3 发布版本:
services.AddControllersWithViews().AddRazorRuntimeCompilation();
https://docs.microsoft.com/en-us/aspnet/core/mvc/views/view-compilation?view=aspnetcore-3.0
也可以有条件地只为本地开发启用,引用自链接:
可以启用运行时编译,使其仅适用于 地方发展。以这种方式有条件地启用可确保 发布的输出:
使用编译视图。 体积更小。 不启用文件观察器 正在生产中。
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
【讨论】:
关于 .Net 核心版本相关的 nuget 包版本的提示。如果您使用 .Net Core 3.0,则无法选择此 Nuget 包的更高版本。但是 Nuget 库的 3.0.0 版适用于 .Net Core 3.0。如果您使用.Net Core 3.1,您可以选择更新的版本。【参考方案4】:使用Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation
包启用运行时编译。要启用运行时编译,应用必须:
安装Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation
NuGet
包。
更新项目的 Startup.ConfigureServices
方法以包含
致电AddRazorRuntimeCompilation
:
services
.AddControllersWithViews()
.AddRazorRuntimeCompilation();
https://docs.microsoft.com/en-us/aspnet/core/mvc/views/view-compilation?view=aspnetcore-3.0
【讨论】:
【参考方案5】:在 ASP.NET Core 3.1 中重新获得运行时 Razor 视图编译:
-
安装
Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation
NuGet 包。
更新项目的Startup.ConfigureServices
方法以包含对AddRazorRuntimeCompilation
的调用。
services.AddRazorPages().AddRazorRuntimeCompilation()
;
Razor file compilation in ASP.NET Core 3.1
【讨论】:
【参考方案6】:只是一个补充说明——您可能只想有条件地启用此运行时编译,以便发布的输出:
使用编译视图。 尺寸更小。 不在生产环境中启用文件观察器。Conditionally enable runtime compilation
【讨论】:
【参考方案7】:第 1 步:从 NuGet Package Manager for Solution 安装以下软件包。
Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation
第二步:在 Startup.cs 文件的 ConfigureServices 中添加如下代码
services.AddControllersWithViews().AddRazorRuntimeCompilation();
保存页面,然后刷新客户端浏览器。
如果您使用的是 Razor,请添加 services.AddRazorPages().AddRazorRuntimeCompilation();
【讨论】:
【参考方案8】:在 .NET Core 3.1 中,您需要禁用 views.dll
文件的生成。
将以下代码添加到您的 .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>
从解决方案的 NuGet 包管理器安装以下包。
Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation
将以下代码添加到您的Startup.cs
文件的ConfigureServices
方法中:
services.AddMvc().AddRazorRuntimeCompilation();
或者
services.AddControllersWithViews().AddRazorRuntimeCompilation();
或者
services.AddRazorPages().AddRazorRuntimeCompilation();
在此之后,再次发布并运行它。它会起作用的。
【讨论】:
对于我的 .NET 5.0,在 .csproj<RazorCompileOnBuild>false</RazorCompileOnBuild> <RazorCompileOnPublish>false</RazorCompileOnPublish> <CopyRefAssembliesToPublishDirectory>false</CopyRefAssembliesToPublishDirectory>
中只需要以下标签【参考方案9】:
为本地开发配置运行时编译的最简单方法是更新launchSettings.json
中的启动配置文件。此方法无需更改代码即可配置在本地运行的项目(不会影响您的生产)。
见the official documentation:
安装 Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation NuGet 包。 修改 launchSettings.json 中的启动配置文件 environmentVariables 部分: 验证
ASPNETCORE_ENVIRONMENT
是否设置为“开发”。 将ASPNETCORE_HOSTINGSTARTUPASSEMBLIES
设置为“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"
【讨论】:
以上是关于.NET Core 3.0:Razor 视图不会在更改时自动重新编译的主要内容,如果未能解决你的问题,请参考以下文章
部分页面上的 ASP.NET Core 3.0 Razor JQuery 验证规则
PartialViewResult 表单不会清除 ajax 结果上的值 - ASP.NET Core Razor c#
覆盖 asp.net core razor 页面中的 razor 视图
在 ASP.NET Core 中将 Razor 视图渲染为字符串