我需要在母版页上的自定义面包屑中隐藏当前节点。我正在使用已经自定义的 SiteMapPath 控件。我正在从 web.sitemap 文件中获取自定义站点地图,并且所有内容都在 web.config 中正确配置。
怎么做?
我需要在母版页上的自定义面包屑中隐藏当前节点。我正在使用已经自定义的 SiteMapPath 控件。我正在从 web.sitemap 文件中获取自定义站点地图,并且所有内容都在 web.config 中正确配置。
怎么做?
当我发现当我隐藏最后一个孩子时,会出现其他问题,分隔符将保持可见。
我找到了一些解决方案:
我将使用 OnItemDataBound
定义:<asp:SiteMapPath OnItemDataBound="SiteMapNodeItemEventHandler" /
>
实施:<asp:SiteMapPath ID="siteMapPath" runat="server" SiteMapProvider="CustomSiteMapProvider" OnItemDataBound="SiteMapPath_OnItemDataBound"
>
cs部分:
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;
}
}
}
感谢您的自我回答,它帮助我入门,然后我对其进行了调整,并认为这段代码更干净一些。虽然我没有深入分析它,但我认为它会运行得更快,因为它只会在最终节点 (SiteMapNodeItemType.Current) 被绑定时运行一次,而每次触发事件时你的代码都会遍历该循环。
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;
}
}