在Blazor的App.razor中使用ErrorBoundary时,何处调用Recover()
Blazor App.razor中ErrorBoundary异常清除的正确方式
要解决导航回退时错误信息残留的问题,核心是监听导航事件,在每次导航(包括浏览器回退)触发时调用ErrorBoundary.Recover()。之前的方法无效,是因为OnParametersSet在App.razor导航时不会触发,而在错误组件里调用会导致错误页面还没显示就被恢复。
具体实现步骤:
- 在App.razor中注入
NavigationManager,并给ErrorBoundary添加引用标记(@ref) - 订阅
NavigationManager的LocationChanged事件,该事件会在所有导航行为(包括回退、前进、跳转)触发时执行 - 在事件处理方法中,判断
ErrorBoundary是否处于错误状态,若是则调用Recover()清除异常 - 组件销毁时取消事件订阅,避免内存泄漏
完整代码示例:
@inject NavigationManager NavManager @implements IDisposable <ErrorBoundary @ref="errorBoundary"> <ChildContent> <Router AppAssembly="@typeof(App).Assembly"> <Found Context="routeData"> <RouteView RouteData="@routeData" DefaultLayout="@typeof(MainLayout)" /> <FocusOnNavigate RouteData="@routeData" Selector="h1" /> </Found> <NotFound> <PageTitle>Not found</PageTitle> <LayoutView Layout="@typeof(MainLayout)"> <p role="alert">Sorry, there's nothing at this address.</p> </LayoutView> </NotFound> </Router> </ChildContent> <ErrorContent> <!-- 替换成你的自定义错误布局或组件 --> <div class="error-container"> <h2>出错了!</h2> <p>@context.Message</p> </div> </ErrorContent> </ErrorBoundary> @code { private ErrorBoundary? errorBoundary; private IDisposable? navigationSubscription; protected override void OnInitialized() { // 订阅导航变更事件 navigationSubscription = NavManager.LocationChanged += OnLocationChanged; } private void OnLocationChanged(object? sender, LocationChangedEventArgs e) { // 仅在ErrorBoundary处于错误状态时恢复 if (errorBoundary?.IsErrorState == true) { errorBoundary.Recover(); } } // 取消订阅,防止内存泄漏 public void Dispose() { navigationSubscription?.Dispose(); } }
这个方案的优势在于:
- 覆盖所有导航场景,包括浏览器回退/前进、代码跳转
- 不会干扰错误页面的正常显示,只有在导航发生时才清除异常
- 全局生效,无需在每个页面单独处理
内容的提问来源于stack exchange,提问作者usausa
相关产品推荐
相关产品推荐

