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

Posted

技术标签:

【中文标题】Razor 页面运行时编译不起作用【英文标题】:Razor Page Runtime Compilation not working 【发布时间】:2020-11-07 03:28:55 【问题描述】:

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

什么不工作?

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

什么有效?

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

我尝试了什么?

为了重现,我按照https://docs.microsoft.com/en-us/aspnet/core/mvc/views/view-compilation?view=aspnetcore-3.1&tabs=visual-studio 中的说明创建了一个新的 MVC 项目,并在创建时启用了 Razor 运行时编译。我可以确认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>

然后我将 &lt;Target&gt; 元素添加到 .csproj 文件中,以将页面放入发布文件夹,这有效,但是当我部署和更改 .cshtml 文件时,我得到了一个异常,即 Microsoft.AspNetCore.Antiforgery.dll 不能找不到。所以我可以看到运行时编译有点工作,但是坏了。

考虑到在我的其他基于 MVC Core 3.1 控制器/视图的项目中,这似乎比它应该的要复杂得多它刚刚工作。我是否遗漏了一些非常明显的东西?

我还查看了其他 StackExchange 问题,尤其是这个问题,但它说的基本相同:

.NET Core 3.0: Razor views don't automatically recompile on change

我正在使用 Visual Studio 2019 Professional 版本 16.6.4

【问题讨论】:

是否可以像从解决方案资源管理器中手动添加页面文件夹一样简单?见this answer。 @YosefBernal 谢谢,虽然这对我没有帮助。该网站运行良好,页面作为编译视图包含在内,我只是无法将未编译的 .cshtml 页面包含在内。似乎没有在输出中包含未编译页面的选项。 它确实有效(我刚刚在我的 3.1 项目中尝试过)。当页面更改时,views dll 将自动重新编译。无需将 /pages 文件夹复制到输出中。 您好@Neil,只是为了确认您已将其用于发布的输出并部署到 IIS?它在 Visual Studio 中运行良好,但正如我上面所说,我什至无法让 .cshtml 页面显示在发布文件夹中以在服务器上对其进行编辑。 页面不会出现在服务器上,因为它们被编译成 DLL!为什么你认为他们需要?你为什么要在服务器上编辑它们?您在调试期间编辑并从 VS 继续,而不是在部署后。 【参考方案1】:

您似乎需要 RazorCompileOnPublish 属性,您可以在 .csproj 文件中设置该属性:

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

  ...
</Project>

RazorCompileOnPublish 设置为false 应该是所有需要的,但我怀疑您不需要.csproj 中的CopyRefAssembliesToPublishDirectory 属性。

【讨论】:

以上是关于Razor 页面运行时编译不起作用的主要内容,如果未能解决你的问题,请参考以下文章

为啥此模型绑定在 Razor 页面中不起作用

折叠的菜单不起作用

使用 Core 2.2 本地化的 Razor 页面不起作用

ASP.NET Razor 页面模型绑定不起作用

Kendo UI 参考在 Razor 视图中不起作用

ASP.NET MVC Razor Url.Action 在 Internet Explorer 8 中不起作用