如何配置Razor Pages,将子文件夹默认页改为子文件夹名+Page后缀文件
解决方案
要在Razor Pages中替换默认的Index.cshtml为子文件夹名称加Page后缀的文件(如SettingsPage.cshtml),需要通过配置Razor Pages约定来实现,避免手动设置路由导致的冲突。以下是具体步骤:
1. 移除手动路由设置
首先删除SettingsPage.cshtml等文件中的@page "/"配置,这类手动路由会与根目录的默认页路由冲突,引发AmbiguousMatchException。
2. 配置Razor Pages约定
在项目的Program.cs(.NET 6+)或Startup.cs(.NET 5及更早)中,通过AddRazorPages的选项配置自定义路由约定:
方式一:针对单个子文件夹配置
如果子文件夹数量不多,可以逐个设置:
builder.Services.AddRazorPages(options => { // 配置Settings文件夹的默认页为SettingsPage.cshtml,路由为/Settings options.Conventions.AddFolderRouteModelConvention("/Settings", model => { foreach (var selector in model.Selectors) { selector.AttributeRouteModel.Template = "Settings"; } options.Conventions.AddPageRoute("/Settings/SettingsPage", "Settings"); }); // 配置Users文件夹的默认页为UsersPage.cshtml,路由为/Users options.Conventions.AddFolderRouteModelConvention("/Users", model => { foreach (var selector in model.Selectors) { selector.AttributeRouteModel.Template = "Users"; } options.Conventions.AddPageRoute("/Users/UsersPage", "Users"); }); });
方式二:通用自动配置(适合多子文件夹)
如果有大量子文件夹,可以通过遍历Pages目录自动生成约定,避免重复代码:
builder.Services.AddRazorPages(options => { var pagesDir = new DirectoryInfo(Path.Combine(builder.Environment.ContentRootPath, "Pages")); foreach (var folder in pagesDir.GetDirectories()) { var folderName = folder.Name; var pageName = $"{folderName}Page"; var pagePath = $"/{folderName}/{pageName}"; // 设置文件夹路由模板为文件夹名称 options.Conventions.AddFolderRouteModelConvention($"/{folderName}", model => { foreach (var selector in model.Selectors) { selector.AttributeRouteModel.Template = folderName; } }); // 将[FolderName]Page.cshtml绑定为该文件夹的默认页 options.Conventions.AddPageRoute(pagePath, folderName); } });
3. 验证效果
完成配置后:
- 访问
/Settings会自动指向/Pages/Settings/SettingsPage.cshtml - 访问
/Users会自动指向/Pages/Users/UsersPage.cshtml - 根目录的
Index.cshtml仍对应/路由,不会产生冲突
内容的提问来源于stack exchange,提问作者Stig Schmidt Nielsson
相关产品推荐
相关产品推荐

