Asp.net core 除非刷新页面,否则NavigationManager.Uri根本不会更新。如何在Blazor服务器中获取真实的当前URI?
我在侧菜单中有这样一个链接(Blazor服务器):Asp.net core 除非刷新页面,否则NavigationManager.Uri根本不会更新。如何在Blazor服务器中获取真实的当前URI?,asp.net-core,blazor,blazor-server-side,Asp.net Core,Blazor,Blazor Server Side,我在侧菜单中有这样一个链接(Blazor服务器): 登录 想法很简单:我想让redirectUri={NavigationManager.Uri}部分始终使用用户所在的当前Uri进行更新,因此无论用户在哪个页面/组件上单击登录链接,正确的redirectUri总是传递到登录页面 但实际上,当用户单击页面上的各种其他时,浏览器地址栏中的URI会发生变化,页面内容也会发生变化,但除非我刷新页面,否则NavigationManager.URI将保持不变 这是故意的吗?如何获得真实的当前Uri而
登录
想法很简单:我想让redirectUri={NavigationManager.Uri}
部分始终使用用户所在的当前Uri进行更新,因此无论用户在哪个页面/组件上单击登录链接,正确的redirectUri
总是传递到登录页面
但实际上,当用户单击页面上的各种其他
时,浏览器地址栏中的URI会发生变化,页面内容也会发生变化,但除非我刷新页面,否则NavigationManager.URI
将保持不变
这是故意的吗?如何获得真实的当前Uri而不更改指向强制更新的事件调用的每个链接?当您单击按钮时,页面仅更改内容,但您呈现的组件NavigationManager.Uri不会重新呈现,因此您可能需要以某种方式重新呈现组件 您可以这样做的一种方式是订阅的事件,并调用
statehaschange
重新加载组件
您可以查看并稍微修改它
@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;
}
}
@实现IDisposable
@注入NavigationManager NavigationManager
@*您的组件*@
登录
@代码{
private void HandleLocationChanged(对象发送方,LocationChangedEventArgs e)
{
//复卷机部件
StateHasChanged();
}
受保护的覆盖无效OnInitialized()
{
//添加到NavigationManager事件
NavigationManager.LocationChanged+=HandleLocationChanged;
}
公共空间处置()
{
//从NavigationManager事件中删除
NavigationManager.LocationChanged-=HandleLocationChanged;
}
}
谢谢。未重新渲染的子组件确实是问题所在。因此,我所要做的就是挂接到NavigationManager.LocationChanged
事件并调用StateHasChanged
,这将重新呈现父组件(在我的例子中是NavMenu)以及子组件。您的代码仍然需要状态已更改
才能正常工作。currentLocation
不是必需的,因为状态已更改
将重新呈现NavigationManager.Uri
@thankyoussd如果这解决了您的问题,请不要忘记将答案标记为已接受并给出一个upvotr,谢谢!
@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;
}
}