如何在Asp.Net Core中通过代码创建新Razor页面及文件夹
Asp.NET Core 代码方式创建Razor页面及对应文件夹实现方案
前置依赖
- 基础的Asp.NET Core Razor Pages项目环境
- 若需要运行时识别动态生成的页面,需提前安装
Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilationNuGet包
实现步骤
- 创建目标文件夹:通过IO接口判断并生成存放Razor页面的目标目录,默认Razor页面存放在项目根目录的
Pages文件夹下 - 生成页面模板内容:按照Razor页面的规范拼接
.cshtml视图文件和.cshtml.cs后台代码文件的内容 - 写入文件到指定路径:将生成的两份模板内容写入到目标文件夹的对应路径下
- 可选配置(运行时访问需配置):启用Razor运行时编译,让程序可以识别新增的页面文件
完整代码示例
using Microsoft.AspNetCore.Hosting; using System.IO; namespace YourProjectNamespace.Utils; public class RazorPageGenerator { private readonly IWebHostEnvironment _hostEnv; // 注入IWebHostEnvironment获取项目根路径 public RazorPageGenerator(IWebHostEnvironment hostEnv) { _hostEnv = hostEnv; } /// <param name="relativeFolderPath">页面存放文件夹的相对路径,相对于/Pages根目录</param> /// <param name="pageName">Razor页面名称,不需要加后缀</param> public void GeneratePage(string relativeFolderPath, string pageName) { // 构造目标文件夹绝对路径 var targetFolder = Path.Combine(_hostEnv.ContentRootPath, "Pages", relativeFolderPath); // 文件夹不存在则创建 if (!Directory.Exists(targetFolder)) { Directory.CreateDirectory(targetFolder); } // 生成.cshtml视图文件内容 var cshtmlContent = $$""" @page @model {{relativeFolderPath.Replace("/", ".")}}.{{pageName}}Model @{ ViewData["Title"] = "{{pageName}}"; } <h1>{{pageName}}</h1> <!-- 页面内容可自定义扩展 --> """; var cshtmlPath = Path.Combine(targetFolder, $"{pageName}.cshtml"); File.WriteAllText(cshtmlPath, cshtmlContent); // 生成.cshtml.cs后台代码文件内容 var csContent = $$""" using Microsoft.AspNetCore.Mvc.RazorPages; namespace YourProjectNamespace.Pages.{{relativeFolderPath.Replace("/", ".")}}; public class {{pageName}}Model : PageModel { public void OnGet() { // 逻辑代码可自定义扩展 } } """; var csPath = Path.Combine(targetFolder, $"{pageName}.cshtml.cs"); File.WriteAllText(csPath, csContent); } }
注意事项
- 代码中的
YourProjectNamespace需要替换为你自己项目的实际命名空间 - 运行时动态生成页面需要额外配置启用Razor运行时编译,在Program.cs中添加如下配置:
builder.Services.AddRazorPages() .AddRazorRuntimeCompilation();
- 不建议在生产环境使用运行时动态生成Razor页面的方案,存在安全风险和性能损耗,该方案更适合开发阶段的脚手架工具使用
内容的提问来源于stack exchange,提问作者Ilya Vasunin
相关产品推荐
相关产品推荐

