我可以查找指定页面的路由列表吗?

Can I lookup the list of routes for a nominated page?

我有类似下面的代码:

@page "/somepage/{Id:guid}/add"
@page "/somepage/{Id:guid}/remove"

@inject NavigationManager navigationManager
@implements IAsyncDisposable

if ( @remove ) {
    <div>Remove!</div>
} else {
    <div>Add!</div>
}

@code{
    [Parameter]
    public Guid Id { get; set; }

    protected override void OnInitialized()
    {
        navigationManager.LocationChanged += HandleLocationChanged;
    }

    public async ValueTask DisposeAsync()
    {
        navigationManager.LocationChanged -= HandleLocationChanged;
    }

    protected override async Task OnParametersSetAsync()
    {
        remove = navigationManager.Uri.Contains("remove");

        // Load some data...

        await base.OnParametersSetAsync();
    }

    private void HandleLocationChanged(object? sender, LocationChangedEventArgs e)
    {
        var pageUris = new[] {
            $"/somepage/{Id}/add",
            $"/somepage/{Id}/remove"
        };

        var uri = navigationManager.Uri.Replace( navigationManager.BaseUri, "" );

        if ( !pageUris.Contains(uri) ) return;

        remove = navigationManager.Uri.Contains("remove");

        // Load some data...

        StateHasChanged();
    }
}

HandleLocationChanged 事件中,我意识到如果用户点击 link 到一个完全不同的页面,那么数据将加载到错误的页面。所以我添加了一个守卫来检查 NavigationManager.Uri - 看看它是否指向不同的位置。

有什么方法可以让它更通用吗?例如,我可以获取特定页面的路由列表,然后在比较中使用它吗?

您的问题询问如何替换硬编码的 pageUris 变量:

var pageUris = new[] {
    $"{navigationManager.BaseUri}somepage/add",
    $"{navigationManager.BaseUri}somepage/remove"
};

知道 @page "/foo" 会导致 [RouteAttribute("foo")] 应用于您的页面生成 class,创建一个函数来替换您的代码很简单:

private string[] GetPageUrls()
{
    return GetType().GetCustomAttributes<RouteAttribute>().Select(x => x.Template).ToArray();
}

这将为您拥有的每个 @page 指令生成一个元素,包含以下值:

"/somepage/add", "/somepage/remove"

在你的问题中,你将它与 navigationManager.BaseUri 结合起来,我认为这不是必需的,因为默认情况下 Blazor 应用程序设置基础 url(即 <base href="/" />),但是如果你想返回它,显然很容易改变 GetPageUrls 来合并它。

最后,如果你想在别处使用它,将它转换成扩展方法应该很简单。