내보내기(0) 인쇄
모두 확장

SiteMapProvider 클래스

모든 사이트 맵 데이터 공급자에 대한 공용 기본 클래스를 제공하고 개발자들이 SiteMap 개체에 대한 영구 저장소로 ASP.NET 사이트 맵 인프라에서 사용할 수 있는 사용자 지정 사이트 맵 데이터 공급자를 구현할 수 있도록 합니다.

네임스페이스: System.Web
어셈블리: System.Web(system.web.dll)

public abstract class SiteMapProvider : ProviderBase
public abstract class SiteMapProvider extends ProviderBase
public abstract class SiteMapProvider extends ProviderBase
적용할 수 없음.

StaticSiteMapProviderXmlSiteMapProvider 클래스는 추상 SiteMapProvider 클래스의 기본 구현을 나타냅니다. XmlSiteMapProvider는 Web.sitemap이라는 XML 파일을 사용하여 사이트 맵 데이터를 저장합니다. Web.sitemap 파일에 대한 자세한 내용은 ASP.NET 사이트 맵을 참조하십시오.

SiteMapProvider 클래스는 RootProviderParentProvider 속성을 선언하여 사이트 맵 공급자 계층 구조의 개념을 지원합니다. SiteMapProvider는 다른 공급자의 자식 또는 부모일 수 있습니다. 따라서 고유한 사이트 맵 및 사이트 맵 공급자를 유지 관리하는 서로 다른 개발 그룹에서 한 사이트의 여러 콘텐츠 영역을 소유하거나 구현할 수 있습니다.

모든 SiteMapProvider 개체는 Web.config 파일에서 구성됩니다. 이러한 구성 파일에 선언된 모든 사이트 맵 공급자는 런타임에 로드되며 사이트 탐색 데이터를 로드 및 처리하는 데 사용됩니다. 해당 Providers 속성 컬렉션을 통해 사용할 수 있는 모든 공급자를 추적하는 SiteMap 개체는 공급자가 관리하는 탐색 데이터에 프로그래밍 방식으로 액세스할 수 있도록 합니다. 다음 코드 예제에서는 Web.config 파일에서 사이트 맵 공급자를 선언하는 데 사용되는 형식을 보여 줍니다.

<siteMap defaultProvider="<name>">
  <providers>
    <add
      name="<friendly name>"
      type="<class name>, <fully-qualified type name>" 
      siteMapFile = "<file name>" />
  </providers>
</siteMap>

이러한 공급자에서 로드한 사이트 탐색 데이터는 SiteMapPathTreeView 컨트롤과 같은 사이트 맵 인프라의 다른 구성 요소에서 사이트 맵 정보를 표시하는 데 사용합니다.

고유한 사이트 맵 공급자를 구현할 경우 ASP.NET 응용 프로그램의 App_Code 디렉터리에 소스 파일을 넣으면 어셈블리가 자동으로 컴파일됩니다. 또한 이러한 고유 사이트 맵 공급자를 GAC(전역 어셈블리 캐시)에 배치하고 Web.config 파일에 해당 공급자에 대한 정규화된 참조를 제공할 수도 있습니다. 컴파일러 서비스에 대한 자세한 내용은 어셈블리 및 전역 어셈블리 캐시 사용을 참조하십시오.

상속자 참고 사항: SiteMapProvider 클래스에서 상속하는 경우 GetRootNodeCore, FindSiteMapNode, GetChildNodesGetParentNode 멤버를 재정의해야 합니다.

항목위치
방법: 비계층적 웹 서버 컨트롤에서 사이트 맵 데이터 표시Building ASP .NET Web Applications
방법: 간단한 사이트 탐색 추가Building ASP .NET Web Applications
방법: ASP.NET 사이트 맵 공급자 구현Building ASP .NET Web Applications
방법: 프로그래밍 방식으로 사이트 맵 노드 열거Building ASP .NET Web Applications
방법: 여러 사이트 맵 및 사이트 맵 공급자 구성Building ASP .NET Web Applications
방법: SiteMapDataSource 웹 서버 컨트롤로 검색되는 노드 필터링Building ASP .NET Web Applications
방법: 프로그래밍 방식으로 사이트 맵 노드 열거Visual Studio에서 ASP .NET 웹 응용 프로그램 빌드
방법: 여러 사이트 맵 및 사이트 맵 공급자 구성Visual Studio에서 ASP .NET 웹 응용 프로그램 빌드
방법: SiteMapDataSource 웹 서버 컨트롤로 검색되는 노드 필터링Visual Studio에서 ASP .NET 웹 응용 프로그램 빌드
방법: 비계층적 웹 서버 컨트롤에서 사이트 맵 데이터 표시Visual Studio에서 ASP .NET 웹 응용 프로그램 빌드
방법: 간단한 사이트 탐색 추가Visual Studio에서 ASP .NET 웹 응용 프로그램 빌드
방법: ASP.NET 사이트 맵 공급자 구현Visual Studio에서 ASP .NET 웹 응용 프로그램 빌드
방법: 간단한 사이트 탐색 추가dv_vwdcon

다음 코드 예제에서는 추상 SiteMapProvider 클래스를 구현하는 클래스 작성 방법을 보여 줍니다. 이 예제에서는 예상 구조체 다음에 쉼표로 구분된 파일을 사용하여 사이트 맵 정보를 로드합니다. 파일의 첫 번째 줄은 사이트 맵의 루트 노드를 나타내고 다음 줄은 하위 노드를 나타냅니다. 각 하위 노드는 URL로 해당 부모 노드를 식별합니다. 이러한 조건을 만족하는 파일의 예는 다음와 같습니다.

default.aspx,Home,MyCompany Home Page,
sale.aspx,Now On Sale,Check Out These Great Deals!,default.aspx
catalog.aspx,Online Catalog,Browse Our Many Great Items!,default.aspx

SimpleTextSiteMapProvider에서는 모든 SiteMapProvider 속성 및 메서드의 구현 예제를 제공합니다.

using System;
using System.Configuration.Provider;
using System.Collections;
using System.Collections.Specialized;
using System.IO;
using System.Security.Permissions;
using System.Web;

namespace Samples.AspNet.CS
{

  [AspNetHostingPermission(SecurityAction.Demand, Level = AspNetHostingPermissionLevel.Minimal)]
  public class SimpleTextSiteMapProvider : SiteMapProvider
  {
    private SiteMapProvider parentSiteMapProvider = null;
    private string simpleTextProviderName = null;
    private string sourceFilename = null;
    private SiteMapNode rootNode = null;
    private ArrayList siteMapNodes = null;
    private ArrayList childParentRelationship = null;


    // A default constructor. The Name property is initialized in the
    // Initialize method.
    public SimpleTextSiteMapProvider()
    {
    }
    // Implement the CurrentNode property.
    public override SiteMapNode CurrentNode
    {
      get
      {
        string currentUrl = FindCurrentUrl();
        // Find the SiteMapNode that represents the current page.
        SiteMapNode currentNode = FindSiteMapNode(currentUrl);
        return currentNode;
      }
    }

    // Implement the RootNode property.
    public override SiteMapNode RootNode
    {
      get
      {
        return rootNode;
      }
    }
    // Implement the ParentProvider property.
    public override SiteMapProvider ParentProvider
    {
      get
      {
        return parentSiteMapProvider;
      }
      set
      {
        parentSiteMapProvider = value;
      }
    }

    // Implement the RootProvider property.
    public override SiteMapProvider RootProvider
    {
      get
      {
        // If the current instance belongs to a provider hierarchy, it
        // cannot be the RootProvider. Rely on the ParentProvider.
        if (this.ParentProvider != null)
        {
          return ParentProvider.RootProvider;
        }
        // If the current instance does not have a ParentProvider, it is
        // not a child in a hierarchy, and can be the RootProvider.
        else
        {
          return this;
        }
      }
    }
    // Implement the FindSiteMapNode method.
    public override SiteMapNode FindSiteMapNode(string rawUrl)
    {

      // Does the root node match the URL?
      if (RootNode.Url == rawUrl)
      {
        return RootNode;
      }
      else
      {
        SiteMapNode candidate = null;
        // Retrieve the SiteMapNode that matches the URL.
        lock (this)
        {
          candidate = GetNode(siteMapNodes, rawUrl);
        }
        return candidate;
      }
    }
    // Implement the GetChildNodes method.
    public override SiteMapNodeCollection GetChildNodes(SiteMapNode node)
    {
      SiteMapNodeCollection children = new SiteMapNodeCollection();
      // Iterate through the ArrayList and find all nodes that have the specified node as a parent.
      lock (this)
      {
        for (int i = 0; i < childParentRelationship.Count; i++)
        {

          string nodeUrl = ((DictionaryEntry)childParentRelationship[i]).Key as string;

          SiteMapNode parent = GetNode(childParentRelationship, nodeUrl);

          if (parent != null && node.Url == parent.Url)
          {
            // The SiteMapNode with the Url that corresponds to nodeUrl
            // is a child of the specified node. Get the SiteMapNode for
            // the nodeUrl.
            SiteMapNode child = FindSiteMapNode(nodeUrl);
            if (child != null)
            {
              children.Add(child as SiteMapNode);
            }
            else
            {
              throw new Exception("ArrayLists not in sync.");
            }
          }
        }
      }
      return children;
    }
    protected override SiteMapNode GetRootNodeCore()
    {
      return RootNode;
    }
    // Implement the GetParentNode method.
    public override SiteMapNode GetParentNode(SiteMapNode node)
    {
      // Check the childParentRelationship table and find the parent of the current node.
      // If there is no parent, the current node is the RootNode.
      SiteMapNode parent = null;
      lock (this)
      {
        // Get the Value of the node in childParentRelationship
        parent = GetNode(childParentRelationship, node.Url);
      }
      return parent;
    }

    // Implement the ProviderBase.Initialize property.
    // Initialize is used to initialize the state that the Provider holds, but
    // not actually build the site map.
    public override void Initialize(string name, NameValueCollection attributes)
    {

      lock (this)
      {

        base.Initialize(name, attributes);

        simpleTextProviderName = name;
        sourceFilename = attributes["siteMapFile"];
        siteMapNodes = new ArrayList();
        childParentRelationship = new ArrayList();

        // Build the site map in memory.
        LoadSiteMapFromStore();
      }
    }
    // Private helper methods

    private SiteMapNode GetNode(ArrayList list, string url)
    {
      for (int i = 0; i < list.Count; i++)
      {
        DictionaryEntry item = (DictionaryEntry)list[i];
        if ((string)item.Key == url)
          return item.Value as SiteMapNode;
      }
      return null;
    }

    // Get the URL of the currently displayed page.
    private string FindCurrentUrl()
    {
      try
      {
        // The current HttpContext.
        HttpContext currentContext = HttpContext.Current;
        if (currentContext != null)
        {
          return currentContext.Request.RawUrl;
        }
        else
        {
          throw new Exception("HttpContext.Current is Invalid");
        }
      }
      catch (Exception e)
      {
        throw new NotSupportedException("This provider requires a valid context.",e);
      }
    }
    protected virtual void LoadSiteMapFromStore()
    {
      string pathToOpen;

      lock (this)
      {
        // If a root node exists, LoadSiteMapFromStore has already
        // been called, and the method can return.
        if (rootNode != null)
        {
          return;
        }
        else
        {
          pathToOpen = HttpContext.Current.Server.MapPath("~" + "\\" + sourceFilename);

          if (File.Exists(pathToOpen))
          {
            // Open the file to read from.
            using (StreamReader sr = File.OpenText(pathToOpen))
            {

              // Clear the state of the collections and rootNode
              rootNode = null;
              siteMapNodes.Clear();
              childParentRelationship.Clear();

              // Parse the file and build the site map
              string s = "";
              string[] nodeValues = null;
              SiteMapNode temp = null;

              while ((s = sr.ReadLine()) != null)
              {

                // Build the various SiteMapNode objects and add
                // them to the ArrayList collections. The format used
                // is: URL,TITLE,DESCRIPTION,PARENTURL

                nodeValues = s.Split(',');

                temp = new SiteMapNode(this,
                    HttpRuntime.AppDomainAppVirtualPath + "/" + nodeValues[0],
                    HttpRuntime.AppDomainAppVirtualPath + "/" + nodeValues[0],
                    nodeValues[1],
                    nodeValues[2]);

                // Is this a root node yet?
                if (null == rootNode &&
                    (null == nodeValues[3] || nodeValues[3] == String.Empty))
                {
                  rootNode = temp;
                }

              // If not the root node, add the node to the various collections.
                else
                {
                  siteMapNodes.Add(new DictionaryEntry(temp.Url, temp));
                  // The parent node has already been added to the collection.
                  SiteMapNode parentNode =
                           FindSiteMapNode(HttpRuntime.AppDomainAppVirtualPath + "/" + nodeValues[3]);
                  if (parentNode != null)
                  {
                    childParentRelationship.Add(new DictionaryEntry(temp.Url, parentNode));
                  }
                  else
                  {
                    throw new Exception("Parent node not found for current node.");
                  }
                }
              }
            }
          }
          else
          {
            throw new Exception("File not found");
          }
        }
      }
      return;
    }
  }

}

  • AspNetHostingPermission  호스팅된 환경에서 작업하는 데 필요한 권한입니다. 요청 값: LinkDemand, 권한 값: Minimal
  • AspNetHostingPermission  호스팅된 환경에서 작업하는 데 필요한 권한입니다. 요청 값: InheritanceDemand, 권한 값: Minimal

이 형식의 모든 public static(Visual Basic의 경우 Shared) 멤버는 스레드로부터 안전합니다. 인터페이스 멤버는 스레드로부터 안전하지 않습니다.

Windows 98, Windows Server 2000 SP4, Windows CE, Windows Millennium Edition, Windows Mobile for Pocket PC, Windows Mobile for Smartphone, Windows Server 2003, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP SP2, Windows XP Starter Edition

Microsoft .NET Framework 3.0은 Windows Vista, Microsoft Windows XP SP2 및 Windows Server 2003 SP1에서 지원됩니다.

.NET Framework

3.0, 2.0에서 지원

커뮤니티 추가 항목

추가
표시:
© 2014 Microsoft