You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

MvcSiteMapNode非特定属性值配置:多路径页面URL参数区分

解决MvcSiteMapNode匹配多参数访问路径的问题

咱们先明确核心需求:你的my_other_controller/index action支持两种URL参数模式(?guid=xxx?mode=yyy),需要让MvcSiteMapNode能正确识别这两种访问路径,同时生成对应的面包屑或站点地图条目。

下面分两种常见场景给出解决方案:

场景1:希望同一个节点匹配两种参数模式

如果不需要区分两种参数对应的不同站点地图条目,只是想让任意一种参数模式都能匹配到这个Details节点,你需要用到preservedRouteParameters属性来保留这两个动态参数,而不是单独设置guid属性。配置如下:

<mvcSiteMapNode title="home" controller="my_controller" action="first_Action">
  <mvcSiteMapNode title="Details" 
                  controller="my_other_controller" 
                  action="index" 
                  preservedRouteParameters="guid,mode" />
</mvcSiteMapNode>

preservedRouteParameters的作用是告诉MvcSiteMapProvider:不管当前请求里有guid还是mode参数,都把这个节点视为匹配的节点,同时在生成URL时会自动带上当前请求中的对应参数。

场景2:需要为两种参数模式分别设置节点(如果有不同显示需求)

如果guidmode对应的页面逻辑或面包屑显示有差异,你可以创建两个子节点,分别对应两种参数:

<mvcSiteMapNode title="home" controller="my_controller" action="first_Action">
  <!-- 匹配?guid=xxx的路径 -->
  <mvcSiteMapNode title="Details (GUID)" 
                  controller="my_other_controller" 
                  action="index" 
                  guid="*" />
  <!-- 匹配?mode=xxx的路径 -->
  <mvcSiteMapNode title="Details (Mode)" 
                  controller="my_other_controller" 
                  action="index" 
                  mode="*" />
</mvcSiteMapNode>

这里的"*"是通配符,表示匹配任意值的guidmode参数。这样当用户访问?guid=123时,会匹配第一个子节点;访问?mode=abc时匹配第二个。

补充说明:关于单独设置guid属性

如果你的场景里必须设置guid属性(比如原有逻辑依赖这个属性),但又要兼容mode参数,那可以把guid设为""(空值),同时加上preservedRouteParameters="mode"——不过这种方式只适合guid是可选参数的情况:

<mvcSiteMapNode title="Details" 
                controller="my_other_controller" 
                action="index" 
                guid="" 
                preservedRouteParameters="mode" />

但更推荐用第一种场景的preservedRouteParameters同时包含两个参数的方案,逻辑更清晰,也能覆盖所有情况。

内容的提问来源于stack exchange,提问作者Leventogenna

火山引擎 最新活动