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

How to you list of all pages in a .NET Razor Pages application?

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

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

对于 Razor 页面,您 可以 通过获取实现 PageModel 的所有类型来做到这一点,但这似乎不适用于没有代码的页面-在 .cshtml.cs 模型文件后面。

如果你想列出所有可导航的页面,你可以使用EndpointDataSource服务。您可以将其注入您的 PageModel 构造函数或直接注入 Razor 页面。下面的例子 returns 页面文件的相对路径,根目录在 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://docs.microsoft.com/en-us/dotnet/api/microsoft.aspnetcore.mvc.razorpages.pageactiondescriptor

此外,如果您想获取每个页面的路由模板,请过滤与 PageRouteMetadata 类型兼容的类型的元数据,例如

if(metadata is PageRouteMetadata)
{
    Routes.Add(((PageRouteMetadata)metadata).PageRoute);
}