Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net core 除非刷新页面,否则NavigationManager.Uri根本不会更新。如何在Blazor服务器中获取真实的当前URI?_Asp.net Core_Blazor_Blazor Server Side - Fatal编程技术网

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

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而

我在侧菜单中有这样一个链接(Blazor服务器):


  • 登录
  • 想法很简单:我想让
    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;
        }
    }