【问题标题】:How can I hide the SiteMapPath root node on home page?如何在主页上隐藏 SiteMapPath 根节点?
【发布时间】:2009-06-26 18:47:03
【问题描述】:

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

首页 > 产品 > 锤子 > 球头

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

首页

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

【问题讨论】:

    标签: asp.net master-pages sitemap


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

      <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;
      }
      

      【讨论】:

        【解决方案3】:

        我设法解决了这个问题,但花了一段时间,因为我遇到的问题有点微妙。 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...
        }
        

        【讨论】:

        • 那么,我正确回答了您的问题,您修复了其他问题并接受了您自己的答案? ;)
        • 不是真的——我已经这样做了,但它不起作用,因为我将查询字符串注入到路径中。接受我自己的答案是完全可以的,它甚至还有一个“自学”徽章,尽管这还不符合条件。我很感激你的回答,我确实赞成。
        【解决方案4】:

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

        【讨论】:

        • 为什么我花了这么长时间才找到这个显而易见的最佳答案?谢谢。
        【解决方案5】:

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

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

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

        【讨论】:

          【解决方案6】:

          通过 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);
            

          【讨论】:

            【解决方案7】:

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

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

            【讨论】:

              【解决方案8】:
              <asp:SiteMapPath ID="contentNavigation" runat="server">
                  <RootNodeTemplate>
                  </RootNodeTemplate>
              </asp:SiteMapPath>
              

              和css代码:

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

              【讨论】:

                【解决方案9】:

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

                源 XML 的示例结构:

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

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

                【讨论】:

                  【解决方案10】:

                  ParentLevelsDisplayed=0 会有所帮助

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

                  【讨论】:

                    猜你喜欢
                    • 2012-05-12
                    • 1970-01-01
                    • 2013-02-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2018-10-28
                    • 1970-01-01
                    相关资源
                    最近更新 更多