如何在asp:SiteMapPath中隐藏当前节点?

时间:2014-06-30 08:38:59

标签: asp.net .net-3.5 master-pages breadcrumbs sitemappath

我需要在母版页上的自定义面包屑中隐藏当前节点。 我正在使用已经自定义的SiteMapPath控件。 我正在从web.sitemap文件中获取自定义站点地图,并且所有都在web.config中正确配置。

怎么做?

2 个答案:

答案 0 :(得分:0)

当我发现当我隐藏最后一个孩子时,会发生其他问题,分隔符将保持可见。

我找到了一些解决方案:

我将使用OnItemDataBound

定义:<asp:SiteMapPath OnItemDataBound="SiteMapNodeItemEventHandler" /&gt; 实施<asp:SiteMapPath ID="siteMapPath" runat="server" SiteMapProvider="CustomSiteMapProvider" OnItemDataBound="SiteMapPath_OnItemDataBound"&gt;

cs part:

protected void SiteMapPath_OnItemDataBound(object sender, SiteMapNodeItemEventArgs e)
    {
        //Hiding current bread crumb node - it will be presented via ajax after page load.
        SiteMapNodeItem nodeItem = e.Item;
        SiteMapNode node = ((SiteMapPath)sender).Provider.CurrentNode;

        // need to hide separator also, so I'm looking for current node index to compare to SiteMapNodeItem.ItemIndex
        // same index will be for node and separator.
        if ((node != null) && (node.ParentNode != null))
        {
            int index = 0;
            do
            {
                node = node.ParentNode;
                index++;
            } while (node.ParentNode != null);

            if (nodeItem.ItemIndex == index)
            {
                nodeItem.Visible = false;
            }
        }
    }

答案 1 :(得分:0)

感谢您的自我回答,它帮助我开始,然后我调整了它,并认为这个代码更清洁一点。虽然我没有深入分析它,但我认为它会运行得更快,因为它只会在最终节点(SiteMapNodeItemType.Current)被绑定时运行一次,而你的代码每次触发事件时都会遍历该循环。 / p>

protected void Breadcrumb_ItemDataBound(object sender, SiteMapNodeItemEventArgs e)
{
   // If this is the current node, hide it along with its 
   // separator (both have same ItemIndex)
   if (e.Item.ItemType == SiteMapNodeItemType.Current)
   {
      foreach (SiteMapNodeItem node in (from SiteMapNodeItem x in ((SiteMapPath)sender).Controls
                                        where x.ItemIndex == e.Item.ItemIndex
                                        select x).ToList())
         node.Visible = false;
   }
}