如何在主页上隐藏SiteMapPath根节点?

时间:2009-06-26 18:47:03

标签: asp.net master-pages sitemap

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

  

主页>产品>锤子> Ball Peen

哪个好。但是当用户在主页上时,SiteMapPath控件将显示

  

主页

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

10 个答案:

答案 0 :(得分:13)

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

mySiteMapPath.Visible = (SiteMap.CurrentNode != SiteMap.RootNode);

答案 1 :(得分:3)

我见过一些基于代码的示例,但这里有一个cheep 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;
}

答案 2 :(得分: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...
}

答案 3 :(得分: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);
    

答案 4 :(得分:1)

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

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

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

答案 5 :(得分:1)

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

答案 6 :(得分:1)

我已经插入了_Layout.cshtml,发现最简单的解决方案是在控制渲染块周围包装一个If语句(以前建议的逻辑),然后调用它:

@if (SiteMap.CurrentNode != SiteMap.RootNode)
{
  @Html.MvcSiteMap().SiteMapPath()
}

答案 7 :(得分:0)

<asp:SiteMapPath ID="contentNavigation" runat="server">
    <RootNodeTemplate>
    </RootNodeTemplate>
</asp:SiteMapPath>

和css代码:

#ctl00_contentNavigation span:nth-child(2),span:nth-child(3)
{
    display:none;
}

答案 8 :(得分:0)

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

源XML的示例结构:

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

如果你不想显示'root'菜单项,你必须在XmlDataSource上简单设置XPath属性值'/ root / *'

答案 9 :(得分:0)

ParentLevelsDisplayed = 0 会有所帮助

<asp:SiteMapPath ID="SiteMapPath1" runat="server" PathSeparator="" 
        ParentLevelsDisplayed="0" >
        <RootNodeTemplate></RootNodeTemplate>            
    </asp:SiteMapPath>