ASP.NET Core 8如何为每个子文件夹设置默认页面?
实现ASP.NET Core Razor Pages子文件夹默认页面
问题原因
你之前用的UseDefaultFiles是针对静态文件的默认页解析逻辑,和Razor Pages的路由机制不兼容,所以无法生效。Razor Pages需要通过自身的路由规则来配置子文件夹的默认页面,以下是几种可行方案:
方案一:直接给页面指定路由(简单直观)
在每个子文件夹的Default.cshtml页面顶部,添加@page指令指定对应路由:
- Pages\Products\Default.cshtml:
@page "/Products" @model 你的项目命名空间.Pages.Products.DefaultModel
- Pages\Members\Default.cshtml:
@page "/Members" @model 你的项目命名空间.Pages.Members.DefaultModel
配置后,访问/Products就会直接加载该子文件夹下的Default页面,同理/Members也会匹配对应页面。
方案二:通过路由约定批量配置(适合多子文件夹场景)
在Program.cs中,通过Razor Pages的路由约定为子文件夹添加默认路由规则,无需逐个修改页面:
builder.Services.AddRazorPages(options => { // 为Products文件夹添加默认路由 options.Conventions.AddFolderRouteModelConvention("/Products", model => { model.Selectors.Add(new SelectorModel { AttributeRouteModel = new AttributeRouteModel { Template = "Products" } }); }); // 为Members文件夹添加默认路由 options.Conventions.AddFolderRouteModelConvention("/Members", model => { model.Selectors.Add(new SelectorModel { AttributeRouteModel = new AttributeRouteModel { Template = "Members" } }); }); }); // 注意中间件顺序:先启用路由,再映射Razor Pages app.UseRouting(); app.MapRazorPages();
方案三:自动遍历所有子文件夹(适合大量子文件夹场景)
如果Pages下有很多子文件夹,可以通过遍历目录的方式自动添加路由约定,避免重复代码:
builder.Services.AddRazorPages(options => { var pagesDir = new DirectoryInfo(Path.Combine(builder.Environment.ContentRootPath, "Pages")); var subFolders = pagesDir.GetDirectories(); foreach (var folder in subFolders) { var folderName = folder.Name; options.Conventions.AddFolderRouteModelConvention($"/{folderName}", model => { model.Selectors.Add(new SelectorModel { AttributeRouteModel = new AttributeRouteModel { Template = folderName } }); }); } }); app.UseRouting(); app.MapRazorPages();
内容的提问来源于stack exchange,提问作者Robin Sun
相关产品推荐
相关产品推荐

