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

Blazor Server基于storage.dbName实现条件路由重定向的解决方法

问题原因
  • OnNavigateAsync 要求返回Task类型的异步方法,你定义为void会导致框架处理导航逻辑时抛出未捕获异常
  • 没有排除数据集选择页的根路径/,会触发无限循环重定向
  • 直接在OnNavigateAsync中调用NavigationManager.NavigateTo会触发Blazor框架内置的NavigationException,这个异常是框架用来中断当前导航的,未被正确处理时就会暴露出来
正确实现方式

你不需要手动调用NavigationManager做跳转,直接给NavigationContext的RedirectTo属性赋值即可,框架会自动处理重定向逻辑,不会触发异常。
完整的App.razor代码如下:

@inject 你的存储服务类型 storage /* 替换成你实际注册的存储服务类/接口名 */
<Router AppAssembly="@typeof(Program).Assembly" OnNavigateAsync="@OnNavigateAsync">
    <!-- 原有Found、NotFound节点内容正常保留即可 -->
</Router>

@code {
    private async Task OnNavigateAsync(NavigationContext args)
    {
        // 排除数据集选择页,避免循环重定向,可根据实际路径调整判断条件
        if (args.Path.Trim('/') == "") return;
        
        // 未选择数据集时触发重定向
        if (string.IsNullOrEmpty(storage.dbName))
        {
            args.RedirectTo = "/";
        }

        // 如果有其他不需要校验数据集的路径(如登录页、公共帮助页),可统一加到上面的排除判断中
        await Task.CompletedTask;
    }
}
补充说明
  • 你通过AddScoped注册的存储服务在Blazor Server中是按SignalR连接生命周期生效的,用户刷新页面、断开重连后存储的dbName会重置,符合你要求每次会话都要选择数据集的需求
  • 如果需要持久化用户选择,可配合浏览器localStorage存储选择结果,应用初始化时先从本地存储读取赋值给storage.dbName即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.10 03:54:04