Blazor 导航:在不更改重新加载页面的情况下更新 URL

Tom*_*man 9 c# blazor blazor-server-side

我在我的应用程序中使用 URL 参数作为页面状态。

如何在不实际导航的情况下更改 URL?

谢谢!

(使用 blazor 服务器端)

Dan*_*lii 18

如果您只想添加/删除/更改 URL 中的查询参数,请使用该NavigationManager.NavigateTo方法。如果没有必要(或未使用forceReload标志调用),它将不会重新加载页面。

例如,当前URL是"https://example.com/page",则调用NavigationManager.NavigateTo("https://example.com/page?id=1")不会重新加载页面,而只会修改URL。在浏览器中单击“返回”会将 URL 更改为"https://example.com/page",此更改可以通过事件处理NavigationManager.LocationChanged

https://learn.microsoft.com/en-us/dotnet/api/microsoft.aspnetcore.components.navigationmanager.navigateto

  • 在这种情况下,“NavigateTo”的“问题”是它实际上会导航,并再次初始化与该路由匹配的页面/组件,据我所知,OP 希望避免这种情况。 (7认同)
  • 我认为这不是真的。导航管理器 NavigateTo 执行客户端路由,并且仅在不是客户端路由时才进行服务器调用。我的 blazor 应用程序读取查询参数,然后使用 NavigateTo 清除 Uri 中的参数。这不会重新加载我的 blazor 应用程序。 (3认同)
  • 从技术上讲,这是正确的解决方案。JS 互操作解决方案对我来说似乎是一个 hack。在 Blazor .NET7 中测试,工作完美,如果不需要,不会重新加载页面。不需要完整的 URL,类似这样的东西也可以``navigationManager.NavigateTo("/counter/50");``` (2认同)
  • 实用提示:从 .NET 6 开始,您可以使用扩展方法 [`NavigationManager#GetUriWithQueryParameters()`](https://learn.microsoft.com/en-us/dotnet/api/microsoft.aspnetcore.components.navigationmanagerextensions。 geturiwithqueryparameters?view=aspnetcore-6.0#microsoft-aspnetcore-components-navigationmanagerextensions-geturiwithqueryparameters(microsoft-aspnetcore-components-navigationmanager-system-collections-generic-ireadonlydictionary((system-string-system-object)))) 创建 URL基于当前 URL,并根据字典中的值设置所需的参数。 (2认同)

Ven*_*sky 10

您可以使用 JS Interop 执行此操作并调用 history.pushState(null, '', url)

这是一个简单的例子

。剃刀

@page "/"
@inject IJSRuntime jsRuntime

<input
    @bind="url"
/>

<button @onclick="ChangeUrl">
    Change Url
</button>

<p>@url</p>

@code {
    [Parameter]
    public string Url { get; set; }

    void ChangeUrl(){
        // You can also change it to any url you want
        jsRuntime.InvokeVoidAsync("ChangeUrl", Url);
    }
}
Run Code Online (Sandbox Code Playgroud)

.js

window.ChangeUrl = function(url){
    history.pushState(null, '', url);   
}
Run Code Online (Sandbox Code Playgroud)

请注意,这仅适用于视觉目的,它只会在服务器端为浏览器更改,您可能不会看到更改。