ASP.NET Core应用编译发布后能否新增Razor视图页面?
ASP.NET Core 发布后动态创建Razor视图的实现方案
核心结论
默认发布的ASP.NET Core应用无法直接新增Razor视图生效,原因是默认开启了Razor预编译:发布时所有.cshtml文件会被编译进程序集,运行时不会读取磁盘上的视图源文件。dotnet new page/dotnet new view是开发阶段的脚手架命令,仅能生成源文件,对已发布的预编译应用没有效果。
可落地的实现步骤
- 第一步:调整项目配置,开启运行时视图编译
- 编辑项目
.csproj文件,在<PropertyGroup>节点下添加配置,关闭发布时的Razor预编译:<RazorCompileOnPublish>false</RazorCompileOnPublish> - 安装NuGet包:
Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation - 在
Program.cs中启用运行时编译,MVC项目示例:
Razor Pages项目示例:builder.Services.AddControllersWithViews() .AddRazorRuntimeCompilation();builder.Services.AddRazorPages() .AddRazorRuntimeCompilation();
- 编辑项目
- 第二步:动态生成视图文件
不需要调用dotnet new相关CLI命令,你可以直接在Web后端代码中,按照业务需求生成Razor语法的文本内容,写入到发布目录对应的视图文件夹即可:- Razor Pages项目写入到
Pages目录下,后缀为.cshtml - MVC项目写入到
Views/对应控制器名目录下,后缀为.cshtml
写入完成后无需重启应用,运行时编译组件会自动检测到新文件并编译生效。
- Razor Pages项目写入到
关键注意事项
Razor视图支持直接编写服务端C#代码,一旦被恶意用户篡改或构造恶意内容,会直接导致远程代码执行漏洞,风险极高:
- 禁止直接允许用户自由输入所有视图内容,建议用固定模板填充参数的方式生成视图
- 必须对操作人做严格的权限校验,仅允许可信人员操作视图创建功能
- 可对生成的视图内容做语法校验,拦截
@开头的C#代码块、@inject/@functions等危险语法
内容的提问来源于stack exchange,提问作者user13973251
相关产品推荐
相关产品推荐

