代码之家  ›  专栏  ›  技术社区  ›  Jamie Ide

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

  •  1
  • Jamie Ide  · 技术社区  · 15 年前

    当用户位于根节点页上时,如何隐藏SiteMapPath控件中的根节点?例如,我在子页面上的breadcrumb跟踪是:

    家用>产品>锤子>球拍

    这很好。但当用户位于主页上时,将显示SiteMapPath控件

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

    10 回复  |  直到 15 年前
        1
  •  13
  •   Jørn Schou-Rode dscher    15 年前

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

    mySiteMapPath.Visible = (SiteMap.CurrentNode != SiteMap.RootNode);
    
        2
  •  3
  •   nc1943    15 年前

    我看过一些基于代码的例子,但是这里有一个cheep css解决方案(您的目标浏览器必须支持css 2.1),它将隐藏根节点和下面的路径分隔符。

    通过将rootnodetemplate设置为空来杀死根节点,如下所示:

    <asp:SiteMapPath ID="SiteMapPath1" runat="server" CssClass="breadCrumbTrail">
       <RootNodeTemplate></RootNodeTemplate>
    </asp:SiteMapPath>
    

    这将使根节点不呈现任何内容,但根的路径分隔符仍将显示,因此将这些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;
    }
    
        3
  •  2
  •   Jamie Ide    15 年前

    我设法弄明白了,但花了一段时间,因为我遇到的问题有些微妙。Schou Rode有正确的想法,这就是我在做的 Page_Load 没有成功。它不工作的原因是因为我在 SiteMapResolve 并返回克隆。这发生在 页负荷 所以 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...
    }
    
        4
  •  1
  •   CScott Tony Miller    13 年前

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

        5
  •  1
  •   jwheron    13 年前

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

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

    要应用上述方法, SiteMapPath1 应该放在母版页上。

        6
  •  1
  •   Daniel Imms    11 年前

    隐藏SiteMapPath根注释的正确方法之一,分三个简单步骤:

    • 从ContentPage引用母版页

      例子:

      <%@ MasterType VirtualPath="~/Master.master" %>
      
    • 在设计器类中将SiteMapPath设置为内部受保护

      例子:

      protected internal global::System.Web.UI.WebControls.SiteMapPath SiteMapPath1;
      
    • 从内容页隐藏

      例子:

      Master.SiteMapPath1.Visible = (SiteMap.CurrentNode != SiteMap.RootNode);
      
        7
  •  1
  •   Sean    11 年前

    我把我的插件插入到我的layout.cshtml中,发现最简单的解决方案是在控件呈现块周围包装一个if语句(使用以前建议的逻辑),并每天调用它:

    @if (SiteMap.CurrentNode != SiteMap.RootNode)
    {
      @Html.MvcSiteMap().SiteMapPath()
    }
    
        8
  •  0
  •   Tarik    14 年前
    <asp:SiteMapPath ID="contentNavigation" runat="server">
        <RootNodeTemplate>
        </RootNodeTemplate>
    </asp:SiteMapPath>
    

    CSS代码:

    #ctl00_contentNavigation span:nth-child(2),span:nth-child(3)
    {
        display:none;
    }
    
        9
  •  0
  •   Ted Hopp    12 年前

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

    源XML的示例结构:

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

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

        10
  •  0
  •   Narender Singh    9 年前

    ParentLevelsDisplayed=0 会帮助

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