I have code similar to the following:
@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();
}
}
In the HandleLocationChanged
event, I realised that if the user clicks on a link to a completely different page, then data will be loaded for the wrong page. So I added a guard to check NavigationManager.Uri
- to see if it points to a different location.
Is there some way to make this more generic? For example, can I get a list of routes for a particular page and then use that in my comparison?