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

在Blazor的App.razor中使用ErrorBoundary时,何处调用Recover()

Blazor App.razor中ErrorBoundary异常清除的正确方式

要解决导航回退时错误信息残留的问题,核心是监听导航事件,在每次导航(包括浏览器回退)触发时调用ErrorBoundary.Recover()。之前的方法无效,是因为OnParametersSet在App.razor导航时不会触发,而在错误组件里调用会导致错误页面还没显示就被恢复。

具体实现步骤:

  1. 在App.razor中注入NavigationManager,并给ErrorBoundary添加引用标记(@ref)
  2. 订阅NavigationManager的LocationChanged事件,该事件会在所有导航行为(包括回退、前进、跳转)触发时执行
  3. 在事件处理方法中,判断ErrorBoundary是否处于错误状态,若是则调用Recover()清除异常
  4. 组件销毁时取消事件订阅,避免内存泄漏

完整代码示例:

@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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 23:06:32