Razor 页面运行时编译不起作用
Razor Page Runtime Compilation not working
我正在尝试让 Razor 运行时编译在 Razor 页面的 MVC Core 3.1 Web 应用程序中工作,但它对我不起作用。这令人沮丧,因为我有几个以前的 MVC Core Web 应用程序跨多个版本(2.0、2.1、3.1)使用按预期工作的控制器和视图。
什么不起作用?
发布项目时,我希望在发布输出中看到一个 /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 controller/view 的项目中 它只是工作。 我我错过了一些非常明显的东西?
我还查看了其他 StackExchange 问题,尤其是这个问题,但它基本上说的是同一件事:
我正在使用Visual Studio2019专业版16.6.4
您似乎需要 RazorCompileOnPublish
属性,您可以在 .csproj 文件中进行设置:
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<RazorCompileOnPublish>false</RazorCompileOnPublish>
...
</PropertyGroup>
...
</Project>
将 RazorCompileOnPublish
设置为 false
应该是所有需要的,但我怀疑您不需要 CopyRefAssembliesToPublishDirectory
属性 在您的 .csproj.
我正在尝试让 Razor 运行时编译在 Razor 页面的 MVC Core 3.1 Web 应用程序中工作,但它对我不起作用。这令人沮丧,因为我有几个以前的 MVC Core Web 应用程序跨多个版本(2.0、2.1、3.1)使用按预期工作的控制器和视图。
什么不起作用?
发布项目时,我希望在发布输出中看到一个 /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 controller/view 的项目中 它只是工作。 我我错过了一些非常明显的东西?
我还查看了其他 StackExchange 问题,尤其是这个问题,但它基本上说的是同一件事:
我正在使用Visual Studio2019专业版16.6.4
您似乎需要 RazorCompileOnPublish
属性,您可以在 .csproj 文件中进行设置:
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<RazorCompileOnPublish>false</RazorCompileOnPublish>
...
</PropertyGroup>
...
</Project>
将 RazorCompileOnPublish
设置为 false
应该是所有需要的,但我怀疑您不需要 CopyRefAssembliesToPublishDirectory
属性 在您的 .csproj.