Blazor中如何检查URL是否存在路由约束并匹配对应路由?
解决Blazor路由匹配判断(导航菜单激活标记)方案
以下是三种不同复杂度的实现方式,可根据项目场景选择:
最简方案:直接使用Blazor内置NavLink组件
无需手写任何判断逻辑,利用Blazor原生的NavLink匹配规则即可实现:
@* 用户列表菜单项,仅完全匹配/users或/users/时激活 *@ <NavLink href="/users" Match="NavLinkMatch.Exact"> 用户列表 </NavLink> @* 用户详情相关菜单项,匹配所有/users/开头的路径 *@ <NavLink href="/users" Match="NavLinkMatch.Prefix"> 用户详情 </NavLink>
NavLinkMatch.Exact为完全匹配模式,刚好适配列表页的路由规则;NavLinkMatch.Prefix为前缀匹配模式,自动适配所有带参数的用户详情页路由。
方案1:轻量正则匹配(适合快速开发)
如果需要拿到匹配结果做自定义逻辑,可直接通过正则+路径判断实现:
- 注入
NavigationManager获取当前访问路径
@inject NavigationManager NavManager
- 编写匹配逻辑
// 判断是否为用户列表页 private bool IsUserListActive => NavManager.Uri.TrimEnd('/') == $"{NavManager.BaseUri.TrimEnd('/')}/users"; // 判断是否为带int参数的用户详情页 private bool IsUserDetailActive => System.Text.RegularExpressions.Regex.IsMatch(NavManager.Uri, @"^.+\/users\/\d+$");
- 直接将布尔值绑定到菜单项的激活类即可。
方案2:复用Blazor原生路由解析(适合路由规则复杂场景)
如果后续路由约束可能调整(比如把int改为guid),不想手动维护正则规则,可直接复用Blazor内置的路由解析能力:
- 引用命名空间
@using Microsoft.AspNetCore.Components.Routing @using Microsoft.AspNetCore.Routing
- 编写匹配逻辑
private (bool isListPage, bool isDetailPage) MatchRoute() { var relativePath = NavManager.ToBaseRelativePath(NavManager.Uri).TrimStart('/').TrimEnd('/'); // 匹配列表页 if (relativePath == "users") { return (true, false); } // 复用Blazor路由约束匹配详情页 var detailTemplate = TemplateParser.Parse("users/{userId:int}"); var routeValues = new RouteValueDictionary(); var isDetailMatch = RouteConstraintMatcher.Match( detailTemplate.Segments, relativePath.Split('/'), routeValues ); return (false, isDetailMatch); }
该方案完全复用Blazor的路由规则,后续修改路由约束时只需修改TemplateParser.Parse传入的路由模板即可,无需调整匹配逻辑。
内容的提问来源于stack exchange,提问作者Isaac Ikusika
相关产品推荐
相关产品推荐

