StaticSiteMapProvider.BuildSiteMap Metode

Definisi

Saat ditimpa dalam kelas turunan, memuat informasi peta situs dari penyimpanan persisten dan membangunnya dalam memori.

public:
 abstract System::Web::SiteMapNode ^ BuildSiteMap();
public abstract System.Web.SiteMapNode BuildSiteMap();
abstract member BuildSiteMap : unit -> System.Web.SiteMapNode
Public MustOverride Function BuildSiteMap () As SiteMapNode

Mengembalikan

Akar SiteMapNode struktur navigasi peta situs.

Contoh

Contoh kode berikut menunjukkan cara menerapkan BuildSiteMap metode untuk mengambil data dari database Microsoft Access dan objek build SiteMapNode yang ditambahkan ke ChildNodes kumpulan simpul peta situs akar. Akhirnya, RootNode properti dikembalikan ke pemanggil.

Contoh kode ini adalah bagian dari contoh yang lebih besar yang disediakan untuk StaticSiteMapProvider kelas .

// Build an in-memory representation from persistent
// storage, and return the root node of the site map.
virtual SiteMapNode ^ BuildSiteMap() override
{
   // Since the SiteMap class is static, make sure that it is
   // not modified while the site map is built.
   System::Threading::Monitor::Enter( this );
   try
   {
      
      // If there is no initialization, this method is being
      // called out of order.
      if (  !IsInitialized )
      {
         throw gcnew Exception( "BuildSiteMap called incorrectly." );
      }
      
      // If there is no root node, then there is no site map.
      if ( nullptr == rootNode )
      {
         
         // Start with a clean slate
         Clear();
         
         // Select the root node of the site map from Microsoft Access.
         int rootNodeId = -1;
         if ( accessConnection->State == ConnectionState::Closed )
            accessConnection->Open();
         
         OleDbCommand^ rootNodeCommand = gcnew OleDbCommand
            ("SELECT nodeid, url, name FROM SiteMap WHERE parentnodeid IS NULL", accessConnection);
         OleDbDataReader^ rootNodeReader = rootNodeCommand->ExecuteReader();
         if ( rootNodeReader->HasRows )
         {
            rootNodeReader->Read();
            rootNodeId = rootNodeReader->GetInt32( 0 );
            
            // Create a SiteMapNode that references the current StaticSiteMapProvider.
            rootNode = gcnew SiteMapNode(this, rootNodeId.ToString(), 
               rootNodeReader->GetString( 1 ),rootNodeReader->GetString( 2 ));
         }
         else
            return nullptr;
         rootNodeReader->Close();
         
         // Select the child nodes of the root node.
         OleDbCommand^ childNodesCommand = gcnew OleDbCommand
            ("SELECT nodeid, url, name FROM SiteMap WHERE parentnodeid = ?", accessConnection);
         OleDbParameter^ rootParam = gcnew OleDbParameter( "parentid", OleDbType::Integer);
         rootParam->Value = rootNodeId;
         childNodesCommand->Parameters->Add( rootParam );
         OleDbDataReader^ childNodesReader = childNodesCommand->ExecuteReader();
         if ( childNodesReader->HasRows )
         {
            SiteMapNode ^ childNode = nullptr;
            while ( childNodesReader->Read() )
            {
               childNode = gcnew SiteMapNode( this, 
                   System::Convert::ToString(childNodesReader->GetInt32( 0 )),
                  childNodesReader->GetString( 1 ),
                  childNodesReader->GetString( 2 ) 
               );
               // Use the SiteMapNode AddNode method to add
               // the SiteMapNode to the ChildNodes collection.
               AddNode( childNode, rootNode );
            }
         }
         childNodesReader->Close();
         accessConnection->Close();
      }
      return rootNode;
   }
   finally
   {
      System::Threading::Monitor::Exit( this );
   }

}
// Build an in-memory representation from persistent
// storage, and return the root node of the site map.
public override SiteMapNode BuildSiteMap() {

    // Since the SiteMap class is static, make sure that it is
    // not modified while the site map is built.
    lock(this) {

        // If there is no initialization, this method is being
        // called out of order.
        if (!IsInitialized) {
            throw new Exception("BuildSiteMap called incorrectly.");
        }

        // If there is no root node, then there is no site map.
        if (null == rootNode) {
            // Start with a clean slate
            Clear();

            // Select the root node of the site map from Microsoft Access.
            int rootNodeId = -1;

            if (accessConnection.State == ConnectionState.Closed)
                accessConnection.Open();
            OleDbCommand rootNodeCommand =
                new OleDbCommand("SELECT nodeid, url, name FROM SiteMap WHERE parentnodeid IS NULL",
                                 accessConnection);
            OleDbDataReader rootNodeReader = rootNodeCommand.ExecuteReader();

            if(rootNodeReader.HasRows) {
                rootNodeReader.Read();
                rootNodeId = rootNodeReader.GetInt32(0);
                // Create a SiteMapNode that references the current StaticSiteMapProvider.
                rootNode   = new SiteMapNode(this,
                                             rootNodeId.ToString(),
                                             rootNodeReader.GetString(1),
                                             rootNodeReader.GetString(2));
            }
            else
            {
                return null;
            }

            rootNodeReader.Close();
            // Select the child nodes of the root node.
            OleDbCommand childNodesCommand =
                new OleDbCommand("SELECT nodeid, url, name FROM SiteMap WHERE parentnodeid = ?",
                                 accessConnection);
            OleDbParameter rootParam = new OleDbParameter("parentid", OleDbType.Integer);
            rootParam.Value = rootNodeId;
            childNodesCommand.Parameters.Add(rootParam);

            OleDbDataReader childNodesReader = childNodesCommand.ExecuteReader();

            if (childNodesReader.HasRows) {

                SiteMapNode childNode = null;
                while(childNodesReader.Read()) {
                    childNode =  new SiteMapNode(this,
                                                 childNodesReader.GetInt32(0).ToString(),
                                                 childNodesReader.GetString(1),
                                                 childNodesReader.GetString(2));

                    // Use the SiteMapNode AddNode method to add
                    // the SiteMapNode to the ChildNodes collection.
                    AddNode(childNode, rootNode);
                }
            }

            childNodesReader.Close();
            accessConnection.Close();
        }
        return rootNode;
    }
}
' Build an in-memory representation from persistent
' storage, and return the root node of the site map.
Public Overrides Function BuildSiteMap() As SiteMapNode

    ' Since the SiteMap class is static, make sure that it is
    ' not modified while the site map is built.
    SyncLock Me

        ' If there is no initialization, this method is being
        ' called out of order.
        If Not IsInitialized Then
            Throw New Exception("BuildSiteMap called incorrectly.")
        End If

        ' If there is no root node, then there is no site map.
        If aRootNode Is Nothing Then
            ' Start with a clean slate
            Clear()

            ' Select the root node of the site map from Microsoft Access.
            Dim rootNodeId As Integer = -1

            If accessConnection.State = ConnectionState.Closed Then
                accessConnection.Open()
            End If
            Dim rootNodeCommand As New OleDbCommand("SELECT nodeid, url, name FROM SiteMap WHERE parentnodeid IS NULL", accessConnection)
            Dim rootNodeReader As OleDbDataReader = rootNodeCommand.ExecuteReader()

            If rootNodeReader.HasRows Then
                rootNodeReader.Read()
                rootNodeId = rootNodeReader.GetInt32(0)
                ' Create a SiteMapNode that references the current StaticSiteMapProvider.
                aRootNode = New SiteMapNode(Me, rootNodeId.ToString(), rootNodeReader.GetString(1), rootNodeReader.GetString(2))
            Else
                Return Nothing
            End If
            rootNodeReader.Close()
            ' Select the child nodes of the root node.
            Dim childNodesCommand As New OleDbCommand("SELECT nodeid, url, name FROM SiteMap WHERE parentnodeid = ?", accessConnection)
            Dim rootParam As New OleDbParameter("parentid", OleDbType.Integer)
            rootParam.Value = rootNodeId
            childNodesCommand.Parameters.Add(rootParam)

            Dim childNodesReader As OleDbDataReader = childNodesCommand.ExecuteReader()

            If childNodesReader.HasRows Then

                Dim childNode As SiteMapNode = Nothing
                While childNodesReader.Read()
                    childNode = New SiteMapNode(Me, _
                    childNodesReader.GetInt32(0).ToString(), _
                    childNodesReader.GetString(1), _
                    childNodesReader.GetString(2))

                    ' Use the SiteMapNode AddNode method to add
                    ' the SiteMapNode to the ChildNodes collection.
                    AddNode(childNode, aRootNode)
                End While
            End If

            childNodesReader.Close()
            accessConnection.Close()
        End If
        Return aRootNode
    End SyncLock

End Function 'BuildSiteMap

Keterangan

Metode ini BuildSiteMap adalah salah satu anggota abstrak kelas StaticSiteMapProvider . Metode BuildSiteMap ini dipanggil untuk memuat dan membangun simpul peta situs dari penyimpanan persisten. Saat Anda menerapkan metode ini BuildSiteMap , pastikan metode tersebut aman untuk utas, karena beberapa permintaan halaman bersamaan dapat mengakibatkan beberapa panggilan untuk memuat informasi peta situs secara tidak langsung.

Catatan Bagi Implementer

Saat mengambil alih metode di kelas turunan BuildSiteMap() , pastikan untuk menormalkan URL SiteMapNode objek yang Anda tambahkan ke penyedia peta situs Anda, sehingga FindSiteMapNode(String) metode dapat mengambil simpul peta situs terlepas dari apakah URL untuk simpul peta situs disediakan sebagai jalur virtual absolut atau jalur relatif aplikasi. Pelaksana penyedia peta situs yang menggunakan AddNode metode harus menormalkan URL apa pun sebelum menyimpan SiteMapNode objek dalam tabel hash internal atas nama penyedia peta situs.

Perilaku pemangkasan keamanan disertakan SiteMapProvider dalam implementasi kelas dan StaticSiteMapProvider . Namun, agar pemangkasan keamanan berfungsi di kelas turunan, Anda harus mengatur Roles properti objek apa pun SiteMapNode yang Anda buat saat membangun penyedia peta situs saat mengambil BuildSiteMap() alih metode.

Berlaku untuk

Lihat juga