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;
}
}
我在这样的侧边菜单中有一个 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;
}
}