.NET 8网站编译与Razor视图部署:为何需运行时编译包?
关于.NET 8 Razor视图找不到问题的解答
一、为什么那些操作能解决视图找不到的问题?
在.NET 6及以后的版本(包括.NET 8)中,Razor视图默认采用预编译模式:项目编译时,.cshtml文件会被编译成程序集内嵌代码,部署时不需要附带物理视图文件,运行时直接从程序集加载视图。
你遇到的找不到视图的问题,大概率是视图预编译过程出现异常(比如视图语法错误导致预编译失败、项目配置意外跳过了视图预编译等)。而你做的这几步操作,本质是切换到运行时编译模式:
- 安装
Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation包:提供运行时编译Razor视图的核心能力 - 在
Startup.cs(或.NET 6+的Program.cs顶级语句中)添加.AddRazorRuntimeCompilation():启用MVC的运行时编译特性 - 在
.csproj中添加<CopyRazorGenerateFilesToPublishDirectory>true</CopyRazorGenerateFilesToPublishDirectory>:确保发布项目时,把.cshtml物理文件复制到发布目录,让运行时能找到并编译这些文件
这种模式绕开了预编译的问题,直接读取物理视图文件,因此能解决找不到视图的报错。
二、不使用RuntimeCompilation包时,部署Razor视图的标准方式
默认的标准方式就是依赖Razor预编译,不需要额外安装包,只需确保以下几点:
- 视图文件的生成操作保持默认的
Content(右键视图文件→属性→生成操作,默认就是这个值,无需修改) - 项目配置中没有禁用预编译:不要在
.csproj中添加类似<RazorCompileOnBuild>false</RazorCompileOnBuild>的配置 - 正常发布项目:使用
dotnet publish命令或者Visual Studio的发布功能,预编译后的视图会被打包到主程序集或单独的[你的项目名].Views.dll中,随程序一起部署
此时运行时会直接从程序集加载预编译后的视图,不需要物理.cshtml文件存在于服务器上。如果出现视图找不到的问题,优先排查:
- 视图是否存在语法错误(预编译失败会导致视图未被嵌入程序集)
- 发布过程是否完整,有没有遗漏预编译生成的视图程序集
- 项目中是否有自定义的视图查找逻辑,干扰了默认的视图定位
内容的提问来源于stack exchange,提问作者Ethan Schofer
相关产品推荐
相关产品推荐

