You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Blazor:NavigationLock的ConfirmExternalNavigation无法读取最新属性值怎么办?

解决方案

替代Task.Delay(100)的可靠方案

用await Task.Yield()替代固定延迟,代码调整如下:

HasUnsavedChanges = false;
StateHasChanged();
await Task.Yield();
Navigation.NavigateTo(gotoUrl, true);

原理说明

StateHasChanged()仅标记组件需要重新渲染,但Blazor的渲染是异步执行的。直接调用NavigateTo时,NavigationLock的ConfirmExternalNavigation参数还没来得及更新为false,因此触发了浏览器确认框。

Task.Yield()会让出当前执行线程,让Blazor完成当前渲染周期,确保NavigationLock的绑定值已同步更新后,再执行导航操作,比固定延迟更稳定,不存在时间偏差的隐患。

另一种可选方案(更严谨)

如果需要更明确地等待组件状态更新完成,可以结合InvokeAsync使用,但Task.Yield()已经足够简洁解决问题:

HasUnsavedChanges = false;
await InvokeAsync(() => StateHasChanged());
await Task.Yield();
Navigation.NavigateTo(gotoUrl, true);

内容的提问来源于stack exchange,提问作者David Thielen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 09:37:37