2011-12-20 3 views
0

내 사이트가 데이터베이스와 XML 데이터 모두에서 사이트 맵을 동적으로 생성하고 있습니다. 그러나 뉴스 기사를 나열하는 사이트의 일부에 대해 뉴스 기사 세부 정보 페이지를 사이트 맵에 넣지 않기로 결정한 경우이 기능은 훌륭하게 작동합니다. 따라서 (사이트 맵에있는 목록 페이지에서) 뉴스 기사의 제목을 클릭하면 기사가있는 페이지로 연결되지만 해당 페이지/URL은 사이트 맵에 없습니다.다른 SiteMapNode를 사용하기 위해 SiteMap.CurrentNode를 가짜로 설정

는 내가 사이트 맵에있는 뉴스 기사 목록 페이지의 노드 (에 SiteMap.CurrentNode을 변경하려면 페이지로드,

SiteMap.CurrentNode 

기본적으로 사용하는 마스터 페이지에서 컨트롤 및 로직을 가지고). 따라서 본질적으로이 페이지에서 실행되는 모든 논리는 페이지를 목록 페이지처럼 취급합니다. 어쨌든이 일은 찾을 수 없습니다.

이 코드는 내가 알고있는 노드를 내가 원하는 노드로 만들 것입니다.

SiteMap.CurrentNode = newsListingPageNode; 

그러나 CurrentNode을 설정할 수 없습니다 :

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

그래서 기본적으로 나는이 작업을 수행 할 수 있으면 좋겠다.

내가 이것을 할 수있는 방법에 대한 제안? 도움에 감사드립니다.

답변

2

this article에 따르면 SiteMapResolve 이벤트에 대한 사용자 지정 처리기를 만들 수 있으며 이로 인해 사용자 지정 노드를 반환 할 수 있습니다.

+0

감사합니다. Chris, 나는 이것이 대부분의 경우에 분명히 효과가있을 것이라고 생각합니다. 불행히도 적절한 해결책을 제시하기 전까지 귀하의 답변을 보지 못했습니다. 내 알림 설정을 변경해야합니다 ... 나는 이것과 같은 미래의 프로젝트가 아마 이것과 같은 사이트 맵 아키텍처를 사용하고 이러한 솔루션을 사용해야 할 것입니다뿐만 아니라 이것을 시도 할 수 있습니다. – Dmase05

0

내가 생각한 해결책은 다음과 같습니다. 내 취향에 너무 복잡하기는하지만. 현재 열어 본 페이지가 사이트 맵에 없으며 탐색, 컨트롤 및 다른 로직이 사이트 맵 제공자를 사용할 것으로 예상된다는 점을 기억하십시오. 페이지가 사이트 맵에 없으므로 사이트 맵 공급자를 사용할 수 없으므로 사이트 맵과 현재 노드를 수동으로 설정해야합니다. Sitemap의 전체 크기를 크게 늘리면 사이트 맵에 뉴스 페이지가없는 것으로 선택합니다.

먼저 SiteMap.CurrentNode 속성 대신 동적 사이트 맵 공급자의 Custom ThisNode 속성을 사용합니다. 뉴스 세부 정보 페이지 (/news-and-events-detail.aspx) 나는 동적 업체에서 만든 유틸리티 메소드 호출에

 public static SiteMapNode ThisNode 
    { 
     get 
     { 
      if (_thisNode == null) 
      { 
       if (SiteMap.CurrentNode != null) 
       { 
        return SiteMap.CurrentNode; 
       } 
       else 
       { 
        return null; 
       } 
      } 
      else 
      { 
       return _thisNode; 
      } 
     } 
     set 
     { 
      _thisNode = value; 
     } 
    } 

.

// 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"); 

유틸리티 방법입니다 : 나는 그것의 정적 이후 DynamicSiteMapProviders.ThisNode 속성을 재설정해야 할 기본 마스터 페이지에서 지금

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

그리고 내가 방문 다음 페이지를 원하지 않는다 여전히 수동으로 설정된 노드를 사용하십시오. 페이지 수명주기의 OnUnload() 이벤트를 사용하여 논리 및 렌더링을 실행하는 페이지가 완료되면이 작업을 수행합니다. 위의 ThisNode 속성의 Get/Set 논리를 살펴보십시오.

// 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); 
} 
관련 문제