MvcSiteMapNode非特定属性值配置:多路径页面URL参数区分
咱们先明确核心需求:你的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:需要为两种参数模式分别设置节点(如果有不同显示需求)
如果guid和mode对应的页面逻辑或面包屑显示有差异,你可以创建两个子节点,分别对应两种参数:
<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>
这里的"*"是通配符,表示匹配任意值的guid或mode参数。这样当用户访问?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




