.NET Core MVC视图修改后仅全项目发布才生效?求助
在传统ASP.NET MVC里,改个.cshtml文件直接丢服务器就能生效,但.NET Core MVC不一样——默认情况下,Razor视图会被预编译到项目的程序集(.dll文件)里,而非以独立的.cshtml文件形式存于部署目录。所以你单独替换服务器上的视图文件根本没用,服务器加载的还是预编译在dll里的旧版本,必须重新发布整个项目更新dll才能生效。
不过别担心,我们有办法让单独更新视图生效,分场景给你方案:
方案1:禁用预编译(适合开发/测试环境)
如果你只是在开发环境折腾,不想每次改视图都重新发布整个项目,可以直接在你的.csproj项目文件里加一段配置,关闭视图预编译:
<PropertyGroup> <RazorCompileOnPublish>false</RazorCompileOnPublish> <MvcRazorCompileOnPublish>false</MvcRazorCompileOnPublish> </PropertyGroup>
划重点:这个方案不推荐在生产环境用!预编译是为了提升应用启动速度和运行性能,关掉会有明显的性能损耗。
方案2:启用Razor运行时编译(推荐生产/开发通用)
从.NET Core 3.0开始,官方提供了Razor运行时编译功能——它既能保留预编译的性能优势,又能在你修改视图文件时自动重新编译并加载新版本,不需要重启应用或重新发布整个项目。
配置步骤超简单:
- 先安装NuGet包:
Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation - 然后在项目的启动文件里注册服务:
- 如果你用的是.NET 6+的
Program.cs:var builder = WebApplication.CreateBuilder(args); // 把这行加进去,启用运行时编译 builder.Services.AddControllersWithViews().AddRazorRuntimeCompilation(); var app = builder.Build(); // 后面的中间件配置正常编写即可 - 要是用的是.NET Core 3.x-5.x的
Startup.cs:public void ConfigureServices(IServiceCollection services) { // 在AddControllersWithViews后添加这个扩展方法 services.AddControllersWithViews().AddRazorRuntimeCompilation(); }
- 如果你用的是.NET 6+的
- 部署之后,不管是IIS还是Azure App Service,直接替换服务器上的
.cshtml文件,刷新页面就能看到更新了!
针对Azure App Service的额外注意点
如果你用Azure App Service,还有个小坑要留意:
如果你的App Service开启了WEBSITE_RUN_FROM_PACKAGE(默认部署方式会设为1),那App Service是从压缩包直接运行的,你没法直接修改目录里的文件。这时候你要么把WEBSITE_RUN_FROM_PACKAGE改成0,要么换用Zip Deploy的方式部署(而非默认的Run From Package),这样才能顺利替换视图文件。
另外,你也可以用Azure门户里的Kudu高级工具,直接进到site/wwwroot/Views目录上传修改后的视图文件,不用走整个发布流程,超方便!
内容的提问来源于stack exchange,提问作者joym8

