[英]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.Endpoints
是EndpointDataSource
的類型,它包含Endpoints
列表,我們可以在其中獲取與端點/頁面或路由元數據相關的信息。
EndpointDataSource.Endpoints" 在 .cshtml 文檔之外,這看起來很奇怪。
如您所見, Endpoints
是IReadOnlyList
的一種類型,它的父級 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.