Razor 页面运行时编译不起作用

Rob*_*obA 7 c# razor asp.net-core asp.net-core-3.1

我试图让 Razor 运行时编译在 Razor 页面的 MVC Core 3.1 Web 应用程序中工作,但它对我不起作用。令人沮丧的是,因为我在多个版本(2.0、2.1、3.1)中使用了按预期工作的控制器和视图,所以我有几个以前的 MVC Core Web 应用程序。

什么不起作用?

发布项目时,我希望在发布输出中看到一个带有我的 .cshtml 文件的 /pages 文件夹。没有,并且发布文件夹中的任何位置都没有 .cshtml 文件。

有什么作用?

该网站运行良好,按预期提供页面,因此页面被WebApplication3.1.Views.dll正确编译到程序集中。这里没有问题。

我尝试了什么?

为了重现,我按照https://docs.microsoft.com/en-us/aspnet/core/mvc/views/view-compilation?view=aspnetcore 中的说明创建了一个新的 MVC 项目,并在创建时启用了 Razor 运行时编译-3.1&tabs=visual-studio。我可以确认该Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation.dll程序集存在于已发布的输出中,并services.AddRazorPages().AddRazorRuntimeCompilation()从该Startup.ConfigureServices方法中调用。查看文档和几个 StackExchange 答案后,这应该足以启用运行时编译。.csproj 文件如下所示:

<Project Sdk="Microsoft.NET.Sdk.Web">
  <PropertyGroup>
    <TargetFramework>netcoreapp3.1</TargetFramework>
    <RootNamespace>WebApplication3._1</RootNamespace>
    <CopyRefAssembliesToPublishDirectory>false</CopyRefAssembliesToPublishDirectory>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation" Version="3.1.4" />
  </ItemGroup>
</Project>
Run Code Online (Sandbox Code Playgroud)

然后我将<Target>元素添加到 .csproj 文件中以将页面放入发布文件夹中,该文件夹有效,但是当我部署和更改 .cshtml 文件时,我遇到了Microsoft.AspNetCore.Antiforgery.dll无法找到的异常。所以我可以看到运行时编译是有效的,但被破坏了。

在这一点上,这似乎比它应该的更复杂,考虑到在我的其他基于 MVC Core 3.1 控制器/视图的项目中它刚刚工作。我错过了一些非常明显的东西吗?

我还查看了其他 StackExchange 问题,特别是这个问题,但它基本上说的是同一件事:

.NET Core 3.0:Razor 视图不会在更改时自动重新编译

我使用的是 Visual Studio 2019 专业版 16.6.4

Kir*_*kin 4

看起来您需要该RazorCompileOnPublish属性,您可以在 .csproj 文件中设置该属性:

<Project Sdk="Microsoft.NET.Sdk.Web">
  <PropertyGroup>
    <RazorCompileOnPublish>false</RazorCompileOnPublish>
    ...
  </PropertyGroup>

  ...
</Project>
Run Code Online (Sandbox Code Playgroud)

设置RazorCompileOnPublishfalse应该是所需要的,但我怀疑您不需要CopyRefAssembliesToPublishDirectory在 .csproj 中使用该属性。