NavigationManager.Uri 除非刷新页面,否则根本不会更新。如何在 Blazor Server 中获取真实的当前 URI?

NavigationManager.Uri does not update at all unless page is refreshed. How to get real current URI in Blazor Server?

我在这样的侧边菜单中有一个 link(Blazor 服务器):

<NotAuthorized>
  <li class="nav-item px-3">
    <NavLink class="nav-link" href="@($"LoginIDP?redirectUri=
    {NavigationManager.Uri}")">
       Login
    </NavLink>
  </li>
</NotAuthorized>

想法很简单:我想让 redirectUri={NavigationManager.Uri} 部分随时更新用户所在的当前 Uri,因此无论用户在哪个 page/component 上单击登录 link,正确的redirectUri总是传递给登录页面。

但实际上,当用户点击页面上的各种其他 <NavLink> 时,浏览器地址栏中的 URI 确实会发生变化,页面内容也会发生变化,但 NavigationManager.Uri 保持不变,除非我刷新页面。

这是设计使然吗?如何在不将每个 link 更改为某个强制更新的事件调用的情况下获取真实的当前 Uri?

当您单击按钮时,页面仅更改内容,但您呈现 NavigationManager.Uri 的组件不会重新呈现,因此您可能需要以某种方式重新呈现组件才能做到这一点。

您可以这样做的一种方法是订阅 NavigationManager's LocationChanged 事件并调用 StateHasChanged 重新呈现组件。

大家可以看一下this example from the docs稍微修改一下

@implements IDisposable
@inject NavigationManager NavigationManager

@* Your component *@
<NotAuthorized>
  <li class="nav-item px-3">
    <NavLink class="nav-link" href="@($"LoginIDP?redirectUri=
    {NavigationManager.Uri}")">
       Login
    </NavLink>
  </li>
</NotAuthorized>

@code {
    
    private void HandleLocationChanged(object sender, LocationChangedEventArgs e)
    {
        // rerender component
        StateHasChanged();
    }

    protected override void OnInitialized()
    {
        // add to the NavigationManager event
        NavigationManager.LocationChanged += HandleLocationChanged;

    }

    public void Dispose()
    {
        // remove from the NavigationManager event
        NavigationManager.LocationChanged -= HandleLocationChanged;
    }
}