Вот решение, которое я придумал, хотя оно слишком сложное для моего вкуса. Помните, что проблема в том, что просматриваемая в данный момент страница отсутствует в карте сайта, и навигация, элементы управления и другая логика ожидают использования поставщика карты сайта. Поскольку страница отсутствует в карте сайта, поставщик карты сайта недоступен, поэтому мне приходится вручную устанавливать карту сайта и текущий узел. Мы решили не включать страницы новостей в карту сайта, поскольку это значительно увеличило бы общий размер карты сайта.
Во-первых, я использую собственное свойство ThisNode поставщика динамической карты сайта, а не свойство SiteMap.CurrentNode.
public static SiteMapNode ThisNode
{
get
{
if (_thisNode == null)
{
if (SiteMap.CurrentNode != null)
{
return SiteMap.CurrentNode;
}
else
{
return null;
}
}
else
{
return _thisNode;
}
}
set
{
_thisNode = value;
}
}
На странице сведений о новостях (/news-and-events-detail.aspx) я вызываю служебный метод, созданный в динамическом провайдере.
// Set the ThisNode property to the /news-and-events-list.aspx node.
// This will allow all sitemap driven controls and logic (such as navs, info bar, and dynamic links) to function since these detail pages are not in the sitemap.
DynamicSiteMapProviders.SetThisNodeToAlternateNode("/news-and-events-list.aspx");
Это служебный метод:
/// <summary>
/// Sets the DynamicSiteMapProviders.ThisNode property to the node of specified URL.
/// </summary>
/// <param name="urlOfNodeToSetTo">The URL of the node to set from.</param>
public static void SetThisNodeToAlternateNode(string urlOfNodeToSetTo)
{
SiteMapDataSource siteMapDataSource = new SiteMapDataSource();
siteMapDataSource.SiteMapProvider = "Main";
DynamicSiteMapProviders.ThisNode = siteMapDataSource.Provider.FindSiteMapNode(urlOfNodeToSetTo);
}
Теперь на базовой главной странице мне нужно сбросить свойство DynamicSiteMapProviders.ThisNode, поскольку оно статическое, и я не хочу, чтобы на следующей странице, которую я посещаю, все еще использовался узел, заданный вручную. Я делаю это, когда страница завершается запуском логики и рендеринга, используя событие OnUnload () жизненного цикла страницы. Посмотрите на логику Get / Set свойства ThisNode выше.
// This ensures that DynamicSiteMapProviders.ThisNode is not set to the node of a previously viewed page.
// This is mainly for news and events pages that are not in the sitemap and are using the news and events listing page node as the current node.
protected override void OnUnload(EventArgs e)
{
DynamicSiteMapProviders.ThisNode = null;
base.OnUnload(e);
}