我可以查找指定页面的路由列表吗?
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
来合并它。
最后,如果你想在别处使用它,将它转换成扩展方法应该很简单。
我有类似下面的代码:
@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
来合并它。
最后,如果你想在别处使用它,将它转换成扩展方法应该很简单。