如何列出 .NET Razor Pages 应用程序中的所有页面?

问题描述 投票:0回答:1

是否可以获取 .NET 5 Razor Pages 应用程序中所有页面的列表?

我之前已经在 MVC 和 Blazor 中完成了此操作,方法是获取应用程序中所有类型的列表并按其基本类型对其进行过滤(MVC 为

Controller
,Blazor 为
ComponentBase
)。

对于 Razor 页面,您可以通过获取实现

PageModel
的所有类型来完成此操作,但这似乎不适用于没有代码隐藏
.cshtml.cs
模型文件的页面。

asp.net-core razor-pages .net-5
1个回答
8
投票

如果您想列出所有可导航页面,您可以使用

EndpointDataSource
服务。您可以将其注入 PageModel 构造函数或直接注入 Razor 页面。以下示例返回以 Pages 文件夹为根的页面文件的相对路径。数据被添加到哈希集中以防止重复。每个索引文件都有两个端点 - 一个端点带有末尾带有
/Index
的路由模板,另一个端点带有空字符串而不是
/Index

@using Microsoft.AspNetCore.Mvc.RazorPages
@using Microsoft.AspNetCore.Routing
@inject EndpointDataSource EndpointsDataSource

@{
    HashSet<string> Pages = new HashSet<string>();
    foreach (var endpoint in EndpointsDataSource.Endpoints)
    {
        foreach(var metadata in endpoint.Metadata)
        {
            if(metadata is PageActionDescriptor)
            {
                Pages.Add(((PageActionDescriptor)metadata).RelativePath);
            }
        }
    }
}
<ul>
    @foreach(var p in Pages)
    {
        <li>@p</li>
    }
</ul>

如果您想获取其他属性,

PageActionDescriptor
类型的文档位于:https://learn.microsoft.com/en-us/dotnet/api/microsoft.aspnetcore.mvc.razorpages.pageactiondescriptor

此外,如果您想获取每个页面的路由模板,请过滤元数据以查找与

PageRouteMetadata
类型兼容的类型,例如

if(metadata is PageRouteMetadata)
{
    Routes.Add(((PageRouteMetadata)metadata).PageRoute);
}
© www.soinside.com 2019 - 2024. All rights reserved.