1

当用户在根节点页面上时,如何在 SiteMapPath 控件中隐藏根节点?例如,我在子页面上的面包屑路径是:

首页 > 产品 > 锤子 > 球头

这很好。但是当用户在主页上时,SiteMapPath 控件会显示

这是无用的混乱。当用户在主页上时,我想禁止显示主页(根节点)。我在母版页中有 SiteMapPath 控件。此外,我正在处理 SiteMapResolve 以在节点中设置查询字符串。

4

10 回答 10

13

一种可能的解决方案是简单地隐藏SiteMapPath主页上的控件:

mySiteMapPath.Visible = (SiteMap.CurrentNode != SiteMap.RootNode);
于 2009-06-26T19:01:41.347 回答
3

我看过一些基于代码的示例,但这里有一个廉价的 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;
}
于 2010-01-08T22:29:10.857 回答
2

我设法解决了这个问题,但花了一段时间,因为我遇到的问题有点微妙。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...
}
于 2009-06-26T19:12:46.753 回答
1

通过 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);
    
于 2010-05-26T12:00:55.703 回答
1

在主页上,将以下脚本添加到“head”部分:

protected void Page_Load(object sender, EventArgs e)
{
    SiteMapPath sp = (SiteMapPath)Master.FindControl("SiteMapPath1");
    sp.Visible = (SiteMap.CurrentNode != SiteMap.RootNode);
}

要应用上述方法,SiteMapPath1应放在 MasterPage 上。

于 2011-05-16T12:02:48.340 回答
1

SiteMapDataSource 上还有一个 ShowStartingNode 属性。将此设置为 false 以隐藏根节点。

于 2011-08-17T19:19:00.710 回答
1

我已将我的插件插入到我的 _Layout.cshtml 中,并发现最简单的解决方案是在控件渲染块周围包装一个 If 语句(具有先前建议的逻辑)并称之为一天:

@if (SiteMap.CurrentNode != SiteMap.RootNode)
{
  @Html.MvcSiteMap().SiteMapPath()
}
于 2013-04-08T02:30:19.820 回答
0
<asp:SiteMapPath ID="contentNavigation" runat="server">
    <RootNodeTemplate>
    </RootNodeTemplate>
</asp:SiteMapPath>

和CSS代码:

#ctl00_contentNavigation span:nth-child(2),span:nth-child(3)
{
    display:none;
}
于 2010-04-05T20:08:37.860 回答
0

最近我遇到了类似的问题,但我在解决方案中使用 XmlDataSource 作为菜单。

源 XML 的示例结构:

<root>
  <Menu text="" url=""/>
  <Menu text="" url=""/>
</root>

如果您不想显示“根”菜单项,您必须简单地将 XmlDataSource 上的 XPath 属性设置为值“/root/*”

于 2011-01-16T19:45:29.177 回答
0

ParentLevelsDisplayed=0会有所帮助

<asp:SiteMapPath ID="SiteMapPath1" runat="server" PathSeparator="" 
        ParentLevelsDisplayed="0" >
        <RootNodeTemplate></RootNodeTemplate>            
    </asp:SiteMapPath>
于 2015-04-15T12:50:45.720 回答