.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 &lt;RazorCompileOnBuild&gt;false&lt;/RazorCompileOnBuild&gt; &lt;RazorCompileOnPublish&gt;false&lt;/RazorCompileOnPublish&gt; &lt;CopyRefAssembliesToPublishDirectory&gt;false&lt;/CopyRefAssembliesToPublishDirectory&gt; 中只需要以下标签【参考方案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 视图渲染为字符串

在 Razor 视图中使用 Ajax 进行 Asp.Net Core 表分页

.net core razor 页面中的多个视图组件未正确绑定