Подделка SiteMap.CurrentNode для использования другого существующего SiteMapNode - PullRequest
0 голосов
/ 20 декабря 2011

Мой сайт динамически создает карту сайта из базы данных и данных XML. Однако это прекрасно работает для той части сайта, где перечислены новостные статьи, и было решено не размещать страницы с подробностями новостной статьи в карте сайта. Поэтому, если вы нажмете на заголовок новостной статьи (со страницы листинга, которая находится в карте сайта), вы попадете на страницу со статьей, но эта страница / url отсутствует в карте сайта.

У меня есть элементы управления и логика на главных страницах, которые используют

SiteMap.CurrentNode

По сути, при загрузке страницы я хотел бы изменить SiteMap.CurrentNode на узел страницы со списком новостных статей (который находится в карте сайта). Таким образом, практически вся логика, работающая на этой странице, будет обрабатывать страницу, как если бы она была страницей листинга. Я не могу найти, чтобы сделать это.

Этот код даст мне нужный мне узел, поскольку я знаю его ключ.

SiteMapDataSource siteMapDataSource1 = new SiteMapDataSource();
    siteMapDataSource1.SiteMapProvider = "Main";
    SiteMapNode newsListingPageNode = siteMapDataSource1.Provider.FindSiteMapNodeFromKey(siteMapKey);

В общем, я бы хотел сделать это:

SiteMap.CurrentNode = newsListingPageNode;

Но CurrentNode не может быть установлен.

Есть предложения, как мне это сделать? Я ценю помощь.

Ответы [ 2 ]

2 голосов
/ 21 декабря 2011

Согласно этой статье , вы можете создать собственный обработчик для события SiteMapResolve, и, вероятно, вы могли бы вернуть пользовательский узел из этого.

0 голосов
/ 30 января 2012

Вот решение, которое я придумал, хотя оно слишком сложное для моего вкуса. Помните, что проблема в том, что просматриваемая в данный момент страница отсутствует в карте сайта, и навигация, элементы управления и другая логика ожидают использования поставщика карты сайта. Поскольку страница отсутствует в карте сайта, поставщик карты сайта недоступен, поэтому мне приходится вручную устанавливать карту сайта и текущий узел. Мы решили не включать страницы новостей в карту сайта, поскольку это значительно увеличило бы общий размер карты сайта.

Во-первых, я использую собственное свойство 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);
}
...