簡體   English   中英

如何在 razor 頁面應用程序中獲取 razor 頁面的列表?

[英]How can i can get a list of razor pages in a razor pages app?

我正在嘗試創建一個簡單的導航菜單,它會自動填充指向與特定查詢匹配的頁面的鏈接(例如子目錄或名稱包含 x 等)。

我可以使用以下方法獲取每個索引頁面的基本路徑:

    HashSet<string> pages2 = new HashSet<string>();
    foreach (var endpoint in endpointDataSource.Endpoints)
    {
        foreach (var metadata in endpoint.Metadata)
        {
            if (metadata is PageRouteMetadata)
            {
                pages2.Add(((PageRouteMetadata)metadata).PageRoute);
            }
        }
    }

這是我從一個類似的問題中得到的: https://stackoverflow.com/questions/66972707/how-to-you-list-of-all-pages-in-a.net-razor-pages-application但我不無法完全理解這里發生的事情。 “endpointDataSource.Endpoints”中有什么,它在哪里定義的? 什么是“PageRouteMetadata”類型等...似乎您也不能在 .cshtml 文檔之外使用“endpointDataSource.Endpoints”,這看起來很奇怪。

有沒有更好的方法來完成這個? 我假設 Razor Pages 路由本身會為這類事情提供方法,因為它被吹捧為簡化路由。

這些文檔對循環引用沒有幫助,例如。 “DefaultEndpointDataSource 初始化 DefaultEndpointDataSource class 的新實例。” “DefaultEndpointDataSource Class 提供端點實例的集合。” “端點 Class 派生 Microsoft.AspNetCore.Routing.RouteEndpoint”

我確信這對 .NET 和 MVC 專家來說非常有用。 但對我來說,它只是一堆相互鏈接的術語,沒有解釋它們的目的或用例。

我還嘗試在 .NET subreddit 上詢問。 但他們幾乎只是想向我推銷 CMS 服務,並聲稱不能或不應該這樣做。

但我不完全明白這里發生了什么。 “endpointDataSource.Endpoints”中有什么,它在哪里定義的?

好吧,這種開箱即用的場景,你現在可能會得到更少的例子,但它是可以解決的。 如果您進行調查,您會看到endpointDataSource.EndpointsEndpointDataSource的類型,它包含Endpoints列表,我們可以在其中獲取與端點/頁面或路由元數據相關的信息。

在此處輸入圖像描述

EndpointDataSource.Endpoints" 在 .cshtml 文檔之外,這看起來很奇怪。

在此處輸入圖像描述

如您所見, EndpointsIReadOnlyList的一種類型,它的父級 class EndpointDataSource是一個abstruct class 所以是的,我們不能直接實例化它,但當然我們可以在任何地方調用它。 由於它的abstruction level ,我們需要引入構造函數來調用它。

有沒有更好的方法來完成這個?

是的,事實上我們確實有更好的方法來調用它以獲取所有頁面名稱,以及它的元數據。 這是為您准備的完整演示。

Asp.net 核心 Razor 獲取所有包含頁面名稱的頁面:

public class ListAllRazorPagesModel : PageModel
    {
        private readonly IEnumerable<EndpointDataSource> _endpointSources;
        public ListAllRazorPagesModel(IEnumerable<EndpointDataSource> endpointDataSources)
        {
            _endpointSources = endpointDataSources;
        }
       
        public IEnumerable<RouteEndpoint> EndpointSources { get; set; }
        public void OnGet()
        {

            EndpointSources = _endpointSources
                        .SelectMany(es => es.Endpoints)
                        .OfType<RouteEndpoint>();
        }
    }

注意:我已經使用ListAllRazorPagesModel構造函數注入EndpointDataSource以在其上調用Endpoints

看法:

@page
@model ListAllRazorPagesModel
<table class="table">
    <thead>
        <tr>
            <th>Display Name
            <th>URL
            <th>Route Pattern
           
        </tr>
    </thead>
    <tbody>
        @foreach (var pageName in @Model.EndpointSources)
        {
            <tr>
                <td>@pageName.DisplayName?.TrimStart('/')</td>
                <td>@pageName</td>
                <td>@pageName.RoutePattern.RawText</td>
            </tr>
        }
    </tbody>
</table>

Output:

在此處輸入圖像描述

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM