.NET 5环境下ASP.NET项目Views文件夹无法复制至构建目录及Razor运行时编译异常求助
针对你在.NET5项目里遇到的「Views文件夹无法复制到构建/发布目录、启用运行时编译后修改视图触发Antiforgery引用异常」的问题,结合你的核心需求——无需重新编译即可编辑Razor视图,我整理了一套可行的解决方案:
一、确保Views文件夹被完整复制到发布目录
之前的配置缺少关键项,你需要更新csproj文件,添加以下完整配置:
<PropertyGroup> <TargetFramework>net5.0</TargetFramework> <PreserveCompilationContext>true</PreserveCompilationContext> <!-- 关闭编译阶段的Razor编译,保留原始cshtml文件 --> <RazorCompileOnBuild>false</RazorCompileOnBuild> <!-- 关闭发布阶段的Razor编译,避免cshtml被编译成dll --> <RazorCompileOnPublish>false</RazorCompileOnPublish> <!-- 复制Razor生成文件到发布目录 --> <CopyRazorGenerateFilesToPublishDirectory>true</CopyRazorGenerateFilesToPublishDirectory> <!-- 以"保留最新版本"的策略复制原始Razor文件到发布目录 --> <CopyRazorFilesToPublishDirectory>PreserveNewest</CopyRazorFilesToPublishDirectory> </PropertyGroup>
重点是加上<RazorCompileOnPublish>false</RazorCompileOnPublish>和<CopyRazorFilesToPublishDirectory>PreserveNewest</CopyRazorFilesToPublishDirectory>,前者确保发布时不会把cshtml编译成程序集,后者保证原始视图文件被复制到目标目录。
二、修复运行时编辑视图的Antiforgery引用异常
添加Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation包后出现的Cannot find reference assembly 'Microsoft.AspNetCore.Antiforgery.dll'异常,是因为运行时编译需要完整的ASP.NET Core引用支持,你可以二选一解决:
方案1:添加ASP.NET Core元包引用
在csproj的<ItemGroup>节点中加入以下内容,这个元包会自动包含所有ASP.NET Core运行时核心组件,包括Antiforgery相关程序集:
<ItemGroup> <FrameworkReference Include="Microsoft.AspNetCore.App" /> </ItemGroup>
方案2:显式添加Antiforgery包引用
如果元包引用不适合你的项目,可以直接添加对应版本的Antiforgery包,注意版本要和你的.NET5补丁版本一致(比如5.0.17是.NET5的最终补丁版本):
<ItemGroup> <PackageReference Include="Microsoft.AspNetCore.Antiforgery" Version="5.0.17" /> </ItemGroup>
三、确认运行时编译配置正确
在ConfigureServices中确保正确启用Razor运行时编译,建议只在开发环境启用(生产环境如果需要热更新也可以保留):
public void ConfigureServices(IServiceCollection services) { services.AddHttpContextAccessor(); services.AddAuthentication(IdentityConstants.ApplicationScheme) .AddCookie(IdentityConstants.ApplicationScheme, o => { o.Cookie.Path = "/"; }); var mvcBuilder = services.AddControllersWithViews(o => o.Filters.Add(new AuthorizeFilter()) ); // 仅在调试环境启用运行时编译,生产环境可根据需求调整 #if DEBUG mvcBuilder.AddRazorRuntimeCompilation(); #endif }
最后验证步骤
- 先清理项目:右键项目 -> 清理
- 重新生成并发布项目,检查发布目录下是否存在
Views文件夹及对应的.cshtml文件 - 运行发布后的应用,修改任意cshtml文件后刷新页面,确认视图生效且无Antiforgery异常
这样配置后,既满足了Views文件夹复制到目标目录的需求,也能实现无需重新编译即可编辑视图的效果,同时解决了引用缺失的问题。
内容的提问来源于stack exchange,提问作者Antonio Rodríguez

