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>
然后我将 <Target>
元素添加到 .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 页面运行时编译不起作用的主要内容,如果未能解决你的问题,请参考以下文章