当用户在根节点页面上时,如何在 SiteMapPath 控件中隐藏根节点?例如,我在子页面上的面包屑路径是:
首页 > 产品 > 锤子 > 球头
这很好。但是当用户在主页上时,SiteMapPath 控件会显示
家
这是无用的混乱。当用户在主页上时,我想禁止显示主页(根节点)。我在母版页中有 SiteMapPath 控件。此外,我正在处理 SiteMapResolve 以在节点中设置查询字符串。
当用户在根节点页面上时,如何在 SiteMapPath 控件中隐藏根节点?例如,我在子页面上的面包屑路径是:
首页 > 产品 > 锤子 > 球头
这很好。但是当用户在主页上时,SiteMapPath 控件会显示
家
这是无用的混乱。当用户在主页上时,我想禁止显示主页(根节点)。我在母版页中有 SiteMapPath 控件。此外,我正在处理 SiteMapResolve 以在节点中设置查询字符串。
一种可能的解决方案是简单地隐藏SiteMapPath
主页上的控件:
mySiteMapPath.Visible = (SiteMap.CurrentNode != SiteMap.RootNode);
我看过一些基于代码的示例,但这里有一个廉价的 CSS 解决方案(您的目标浏览器必须支持 css 2.1),它将隐藏根节点和以下路径分隔符。
通过将 RootNodeTemplate 设置为空来终止 Root 节点,如下所示:
<asp:SiteMapPath ID="SiteMapPath1" runat="server" CssClass="breadCrumbTrail">
<RootNodeTemplate></RootNodeTemplate>
</asp:SiteMapPath>
这将使它不为 Root 节点呈现任何内容,但仍将显示 Root 的路径分隔符,因此将这些 CSS 选择器添加到您的样式表中(重要:注意我为 SiteMapPath1 元素提供了一个名为“breadCrumbTrail”的 CssClass):
.breadCrumbTrail
{
font-size: small;
}
/*
First child element rendered by a SiteMapPath is an <a> tag you have no control over,
adjacent to that is your root node's span tag, adjacent to that is the root node's
path-separator span: don't display it.
*/
.breadCrumbTrail > a:first-child + span + span
{
display: none;
}
我设法解决了这个问题,但花了一段时间,因为我遇到的问题有点微妙。schou-rode 有正确的想法,这就是我Page_Load
没有成功的做法。它不起作用的原因是我正在克隆节点SiteMapResolve
并返回克隆。这发生在Page_Load
如此SiteMap.CurrentNode
引用克隆和比较SiteMap.RootNode
失败之前。
这是完整的解决方案:
protected void Page_Load(object sender, EventArgs e)
{
SiteMapPath1.Visible = (SiteMap.CurrentNode != SiteMap.RootNode);
}
private SiteMapNode SiteMap_SiteMapResolve(object sender, SiteMapResolveEventArgs e)
{
if (SiteMap.CurrentNode == null || SiteMap.CurrentNode == SiteMap.RootNode)
{
return SiteMap.CurrentNode;
}
// clone and set querystring in other nodes...
}
通过 3 个简单步骤隐藏 SiteMapPath 根注释的正确方法之一:
从 ContentPage 引用 MasterPage
例子:
<%@ MasterType VirtualPath="~/Master.master" %>
在设计器类中将 SiteMapPath 设置为受保护的内部
例子:
protected internal global::System.Web.UI.WebControls.SiteMapPath SiteMapPath1;
从 ContentPage 隐藏它
例子:
Master.SiteMapPath1.Visible = (SiteMap.CurrentNode != SiteMap.RootNode);
在主页上,将以下脚本添加到“head”部分:
protected void Page_Load(object sender, EventArgs e)
{
SiteMapPath sp = (SiteMapPath)Master.FindControl("SiteMapPath1");
sp.Visible = (SiteMap.CurrentNode != SiteMap.RootNode);
}
要应用上述方法,SiteMapPath1
应放在 MasterPage 上。
SiteMapDataSource 上还有一个 ShowStartingNode 属性。将此设置为 false 以隐藏根节点。
我已将我的插件插入到我的 _Layout.cshtml 中,并发现最简单的解决方案是在控件渲染块周围包装一个 If 语句(具有先前建议的逻辑)并称之为一天:
@if (SiteMap.CurrentNode != SiteMap.RootNode)
{
@Html.MvcSiteMap().SiteMapPath()
}
<asp:SiteMapPath ID="contentNavigation" runat="server">
<RootNodeTemplate>
</RootNodeTemplate>
</asp:SiteMapPath>
和CSS代码:
#ctl00_contentNavigation span:nth-child(2),span:nth-child(3)
{
display:none;
}
最近我遇到了类似的问题,但我在解决方案中使用 XmlDataSource 作为菜单。
源 XML 的示例结构:
<root>
<Menu text="" url=""/>
<Menu text="" url=""/>
</root>
如果您不想显示“根”菜单项,您必须简单地将 XmlDataSource 上的 XPath 属性设置为值“/root/*”
ParentLevelsDisplayed=0会有所帮助
<asp:SiteMapPath ID="SiteMapPath1" runat="server" PathSeparator=""
ParentLevelsDisplayed="0" >
<RootNodeTemplate></RootNodeTemplate>
</asp:SiteMapPath>