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
相关产品推荐
相关产品推荐

