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

问题描述

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

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

对于 Razor 页面,您可以通过获取实现 PageModel 的所有类型来实现,但这似乎不适用于没有代码隐藏 {{1 }} 模型文件。

解决方法

如果您想列出所有可导航的页面,您可以使用 EndpointDataSource 服务。您可以将其注入 PageModel 构造函数或直接注入 Razor 页面。以下示例返回页面文件的相对路径,以 Pages 文件夹为根。将数据添加到 Hashset 以防止重复。每个索引文件将有两个端点 - 一个带有末尾带有 /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);
}

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...