Razor应用如何实现URL保留多级未知分类路径的导航路由配置?
实现方案
直接用Razor原生的通配符捕获路由就可以满足需求,不需要复杂的自定义级联参数逻辑。
1. 基础通配符路由实现
不管是Blazor组件还是Razor Pages,都支持在路由模板中加*前缀的参数,用来捕获当前位置之后的所有路径片段:
分类页Blazor组件直接编写如下路由即可匹配任意层级的分类路径:
@page "/{*CategoryPath}"
参数CategoryPath会自动拿到域名之外的完整路径字符串:
- 访问站点根路径时,
CategoryPath的值为null,刚好匹配根分类页 - 访问
/controllers/for-media-screens时,CategoryPath的值为"controllers/for-media-screens"
你只需要把拿到的字符串用Split('/')分割,过滤掉空字符串,就能得到各级分类的slug数组,上面的例子分割后就是["controllers", "for-media-screens"],拿着这个数组去数据库匹配对应分类即可。
2. 产品页路由匹配
产品页需要区分末尾的数字ID,有两种成熟方案可选:
简单优先方案:给产品页也配置通配符路由,自行判断路径格式
@page "/{*FullPath}"在组件初始化时把
FullPath按/分割为片段数组,判断最后一段是否可转换为int:- 可转换:最后一段为产品ID,前面的所有片段为分类路径,正常渲染产品页
- 不可转换:导航到分类页传入当前路径即可
注意要把产品页的路由注册优先级调到比分类页高,避免被分类页先拦截。
规范易维护方案:自定义路由约束
自己实现一个路由约束,判断路径末尾片段为数字,给产品页绑定这个约束,匹配成功才会进入产品页,否则自动走分类页的路由,不需要自己做跳转判断。
3. 路径存储方案说明
你提到的把分类完整路径存数据库是中小型站点的最优选择:
- 可以直接把拼接好的完整路径(比如
"controllers/for-media-screens")作为字段存在分类表中,拿到路径后直接查表匹配,查询效率很高 - 方便做路径合法性校验,用户输入不存在的路径时可以直接返回404
- 后期如果要修改分类slug,也方便做301重定向,对SEO友好
如果分类层级极多、数据量级很大,也可以只存每个分类的父ID和当前层级的slug,拿到分割后的slug数组后从根分类开始逐级匹配,性能也完全够用。
内容的提问来源于stack exchange,提问作者Евгений Ляшенко
相关产品推荐
相关产品推荐

