Blazor Server如何获取不带路由参数的当前页面路径
Blazor Server 获取无参数页面路径的最优实现方案
方案核心:基于Blazor内置路由系统的RouteData实现
该方案无需修改现有页面的路由定义、参数读取逻辑,也不需要逐个页面做参数传递,可靠性远高于自行裁剪URI。
实现步骤
- 获取级联传递的
RouteData
Blazor的Router组件默认会将当前路由的解析结果RouteData作为级联参数全局传递,你可以直接在MainLayout、公共导航组件等任意需要获取页面路径的组件中声明该参数即可:
@code { [CascadingParameter] private RouteData? CurrentRouteData { get; set; } }
- 从页面类型中读取路由模板
所有带@page指令的页面组件,编译时都会自动添加RouteAttribute特性,特性的Template属性就是你定义的原始路由模板(例如/category/page/{param1}/{param2})。 - 裁剪路由模板中的参数段
通过简单的正则替换,把模板中所有/{参数名}格式的路由参数段移除,就能得到你需要的无参数页面路径。
完整代码示例
@using System.Reflection @using Microsoft.AspNetCore.Components.Routing @code { [CascadingParameter] private RouteData? CurrentRouteData { get; set; } private string? PurePagePath { get; set; } protected override void OnParametersSet() { if (CurrentRouteData == null) return; // 读取页面的路由特性 var routeAttr = CurrentRouteData.PageType .GetCustomAttributes<RouteAttribute>(inherit: false) .FirstOrDefault(); if (routeAttr == null) return; // 移除所有路由参数段,兼容可选参数、约束参数等格式 PurePagePath = System.Text.RegularExpressions.Regex .Replace(routeAttr.Template, @"\/{[^}]+}", string.Empty); // 特殊处理根路由:如果处理后为空,赋值为/ if (string.IsNullOrEmpty(PurePagePath)) PurePagePath = "/"; } }
方案优势
- 完全复用Blazor原生路由的解析结果,不会受URI中的参数值、特殊字符影响,准确率100%
- 不需要修改现有页面的任何逻辑,原有路由参数、嵌套路由都可以正常使用
- 仅需要在公共组件中实现一次逻辑,不需要逐个页面做级联参数传递
- 性能开销极低,反射读取特性的消耗在常规业务场景下完全可以忽略,性能要求高的场景也可以提前扫描所有页面的路由模板缓存到字典中,运行时直接查询。
内容的提问来源于stack exchange,提问作者Shannon Roos
相关产品推荐
相关产品推荐

