如何从组件Type或相对URL构建Blazor RouteData对象供RouteView使用
生成RouteData的实现方式
你需要先对指定路径做路由匹配,再从匹配结果中获取RouteData对象,以下是可直接复用的实现:
前置依赖
在_Imports.razor中引入必要命名空间、注入服务:
@using Microsoft.AspNetCore.Components.Routing @using Microsoft.AspNetCore.Http @inject ILoggerFactory LoggerFactory
方式1:手动为指定路径生成RouteData
适合你需要自定义传入/counter这类固定路径的场景:
@code { private RouteData? routeData; protected override void OnInitialized() { // 替换为你需要的目标路由 const string targetRoute = "/counter"; var routeContext = new RouteContext(PathString.FromUriComponent(targetRoute)); // 初始化路由组件加载应用全量路由表 var router = new Router { AppAssembly = typeof(Program).Assembly, LoggerFactory = LoggerFactory }; // 执行路由匹配 router.RouteAsync(routeContext).Wait(); // 路由匹配成功则拿到可用的RouteData if (routeContext.RouteData is not null) { routeData = routeContext.RouteData; // 可按需自定义追加路由参数 // routeData.Values["customParam"] = "testValue"; } } }
方式2:从路由导航事件直接获取
如果你是在App.razor的路由拦截逻辑中使用,可以直接从导航上下文拿到当前路径对应的RouteData,无需手动构造:
<Router AppAssembly="@typeof(Program).Assembly" OnNavigateAsync="HandleNavigate"> <Found Context="foundRouteData"> <RouteView RouteData="@routeData" DefaultLayout="@typeof(MainLayout)" /> </Found> <NotFound> <p>404 页面不存在</p> </NotFound> </Router> @code { private RouteData? routeData; private Task HandleNavigate(NavigationContext context) { // 直接获取当前路径匹配的RouteData routeData = context.RouteData; return Task.CompletedTask; } }
注意事项
- 如果目标路径未匹配到任何注册路由,
RouteData会为null,你可以按需补充404逻辑 RouteData.Values为字典类型,可直接读写自定义路由参数
内容的提问来源于stack exchange,提问作者mz1378
相关产品推荐
相关产品推荐

