Bagikan melalui


Membangun Penyedia Peta Situs (VB) Berbasis Database Kustom

oleh Scott Mitchell

Unduh PDF

Penyedia peta situs default di ASP.NET 2.0 mengambil datanya dari file XML statis. Meskipun penyedia berbasis XML cocok untuk banyak situs Web kecil dan menengah, aplikasi Web yang lebih besar memerlukan peta situs yang lebih dinamis. Dalam tutorial ini kita akan membangun penyedia peta situs kustom yang mengambil datanya dari Lapisan Logika Bisnis, yang pada gilirannya mengambil data dari database.

Pendahuluan

fitur peta situs ASP.NET 2.0 memungkinkan pengembang halaman menentukan peta situs aplikasi web di beberapa media persisten, seperti dalam file XML. Setelah ditentukan, data peta situs dapat diakses secara terprogram melalui SiteMap kelas di System.Web namespace layanan atau melalui berbagai kontrol Web navigasi, seperti kontrol SiteMapPath, Menu, dan TreeView. Sistem peta situs menggunakan model penyedia sehingga implementasi serialisasi peta situs yang berbeda dapat dibuat dan dicolokkan ke dalam aplikasi web. Penyedia peta situs default yang dikirim dengan ASP.NET 2.0 mempertahankan struktur peta situs dalam file XML. Kembali ke tutorial Halaman Master dan Navigasi Situs, kami membuat file bernama Web.sitemap yang berisi struktur ini dan telah memperbarui XML-nya dengan setiap bagian tutorial baru.

Penyedia peta situs berbasis XML default berfungsi dengan baik jika struktur peta situs cukup statis, seperti untuk tutorial ini. Namun, dalam banyak skenario, peta situs yang lebih dinamis diperlukan. Pertimbangkan peta situs yang ditampilkan di Gambar 1, di mana setiap kategori dan produk muncul sebagai bagian dalam struktur situs web. Dengan peta situs ini, mengunjungi halaman web yang sesuai dengan simpul akar mungkin mencantumkan semua kategori, sedangkan mengunjungi halaman web kategori tertentu akan mencantumkan produk kategori tersebut dan melihat halaman web produk tertentu akan menunjukkan detail produk tersebut.

Kategori dan Produk Membuat Struktur Peta Situs

Gambar 1: Kategori dan Produk Membuat Struktur Peta Situs (Klik untuk melihat gambar ukuran penuh)

Meskipun struktur berbasis kategori dan produk ini dapat dikodekan secara permanen ke dalam Web.sitemap file, file perlu diperbarui setiap kali kategori atau produk ditambahkan, dihapus, atau diganti namanya. Akibatnya, pemeliharaan peta situs akan sangat disederhanakan jika strukturnya diambil dari database atau, idealnya, dari Lapisan Logika Bisnis arsitektur aplikasi. Dengan begitu, karena produk dan kategori ditambahkan, diganti namanya, atau dihapus, peta situs akan diperbarui secara otomatis untuk mencerminkan perubahan ini.

Karena serialisasi peta situs ASP.NET 2.0 dtk dibangun di atas model penyedia, kami dapat membuat penyedia peta situs kustom kami sendiri yang mengambil datanya dari penyimpanan data alternatif, seperti database atau arsitektur. Dalam tutorial ini kita akan membangun penyedia kustom yang mengambil datanya dari BLL. Mari kita mulai!

Catatan

Penyedia peta situs kustom yang dibuat dalam tutorial ini digabungkan erat dengan arsitektur aplikasi dan model data. Jeff Prosise menyimpan Peta Situs di SQL Server dan Penyedia Peta Situs SQL yang Telah Anda Tunggu artikel memeriksa pendekatan umum untuk menyimpan data peta situs di SQL Server.

Langkah 1: Membuat Halaman Web Penyedia Peta Situs Kustom

Sebelum kita mulai membuat penyedia peta situs kustom, mari kita terlebih dahulu menambahkan halaman ASP.NET yang kita butuhkan untuk tutorial ini. Mulailah dengan menambahkan folder baru bernama SiteMapProvider. Selanjutnya, tambahkan halaman ASP.NET berikut ke folder tersebut Site.master , pastikan untuk mengaitkan setiap halaman dengan halaman master:

  • Default.aspx
  • ProductsByCategory.aspx
  • ProductDetails.aspx

CustomProviders Tambahkan juga subfolder ke App_Code folder .

Menambahkan Halaman ASP.NET untuk Tutorial Terkait Penyedia Peta Situs

Gambar 2: Tambahkan Halaman ASP.NET untuk Tutorial Terkait Penyedia Peta Situs

Karena hanya ada satu tutorial untuk bagian ini, kita tidak perlu Default.aspx mencantumkan tutorial bagian. Sebagai gantinya, Default.aspx akan menampilkan kategori dalam kontrol GridView. Kami akan mengatasi ini di Langkah 2.

Selanjutnya, perbarui Web.sitemap untuk menyertakan referensi ke Default.aspx halaman. Secara khusus, tambahkan markup berikut setelah Penembolokan <siteMapNode>:

<siteMapNode 
    title="Customizing the Site Map" url="~/SiteMapProvider/Default.aspx" 
    description="Learn how to create a custom provider that retrieves the site map 
                 from the Northwind database." />

Setelah memperbarui Web.sitemap, luangkan waktu sejenak untuk melihat situs web tutorial melalui browser. Menu di sebelah kiri sekarang menyertakan item untuk satu-satu tutorial penyedia peta situs.

Peta Situs Sekarang Menyertakan Entri untuk Tutorial Penyedia Peta Situs

Gambar 3: Peta Situs Sekarang Menyertakan Entri untuk Tutorial Penyedia Peta Situs

Fokus utama tutorial ini adalah mengilustrasikan pembuatan penyedia peta situs kustom dan mengonfigurasi aplikasi web untuk menggunakan penyedia tersebut. Secara khusus, kita akan membangun penyedia yang mengembalikan peta situs yang menyertakan simpul akar bersama dengan simpul untuk setiap kategori dan produk, seperti yang digambarkan dalam Gambar 1. Secara umum, setiap simpul dalam peta situs dapat menentukan URL. Untuk peta situs kami, URL simpul akar akan menjadi ~/SiteMapProvider/Default.aspx, yang akan mencantumkan semua kategori dalam database. Setiap node kategori dalam peta situs akan memiliki URL yang menunjuk ke ~/SiteMapProvider/ProductsByCategory.aspx?CategoryID=categoryID, yang akan mencantumkan semua produk dalam categoryID yang ditentukan. Akhirnya, setiap simpul peta situs produk akan menunjuk ke ~/SiteMapProvider/ProductDetails.aspx?ProductID=productID, yang akan menampilkan detail produk tertentu.

Untuk memulai, kita perlu membuat Default.aspxhalaman , ProductsByCategory.aspx, dan ProductDetails.aspx . Halaman ini masing-masing diselesaikan dalam Langkah 2, 3, dan 4. Karena dorong tutorial ini ada di penyedia peta situs, dan karena tutorial sebelumnya telah membahas pembuatan laporan master/detail multi-halaman ini, kita akan cepat melalui Langkah 2 hingga 4. Jika Anda memerlukan penyegaran tentang membuat laporan master/detail yang mencakup beberapa halaman, lihat kembali tutorial Pemfilteran Master/Detail di Dua Halaman .

Langkah 2: Menampilkan Daftar Kategori

Default.aspx Buka halaman di SiteMapProvider folder dan seret GridView dari Kotak Alat ke Perancang, atur ID ke Categories. Dari tag pintar GridView, ikat ke ObjectDataSource baru bernama CategoriesDataSource dan konfigurasikan sehingga mengambil datanya menggunakan CategoriesBLL metode kelas.GetCategories Karena GridView ini hanya menampilkan kategori dan tidak menyediakan kemampuan modifikasi data, atur daftar drop-down di tab PERBARUI, SISIPKAN, dan HAPUS ke (Tidak Ada) .

Mengonfigurasi ObjectDataSource untuk Mengembalikan Kategori Menggunakan Metode GetCategories

Gambar 4: Konfigurasikan ObjectDataSource untuk Mengembalikan Kategori Menggunakan GetCategories Metode (Klik untuk melihat gambar ukuran penuh)

Atur Daftar Drop-Down di Tab PERBARUI, SISIPKAN, dan HAPUS ke (Tidak Ada)

Gambar 5: Atur Daftar Drop-Down di Tab PERBARUI, SISIPKAN, dan HAPUS ke (Tidak Ada) (Klik untuk melihat gambar ukuran penuh)

Setelah menyelesaikan wizard Konfigurasi Sumber Data, Visual Studio akan menambahkan BoundField untuk CategoryID, , CategoryNameDescription, NumberOfProducts, dan BrochurePath. Edit GridView sehingga hanya berisi CategoryName dan Description BoundFields dan perbarui CategoryName properti BoundField s HeaderText ke Kategori .

Selanjutnya, tambahkan HyperLinkField dan posisikan sehingga menjadi bidang paling kiri. Atur DataNavigateUrlFields properti ke CategoryID dan DataNavigateUrlFormatString properti ke ~/SiteMapProvider/ProductsByCategory.aspx?CategoryID={0}. Atur Text properti ke Lihat Produk .

Menambahkan HyperLinkField ke Categories GridView

Gambar 6: Tambahkan HyperLinkField ke Categories GridView

Setelah membuat ObjectDataSource dan menyesuaikan bidang GridView, markup deklaratif dua kontrol akan terlihat seperti berikut ini:

<asp:GridView ID="Categories" runat="server" AutoGenerateColumns="False" 
    DataKeyNames="CategoryID" DataSourceID="CategoriesDataSource" 
    EnableViewState="False">
    <Columns>
        <asp:HyperLinkField DataNavigateUrlFields="CategoryID" 
            DataNavigateUrlFormatString=
                "~/SiteMapProvider/ProductsByCategory.aspx?CategoryID={0}"
            Text="View Products" />
        <asp:BoundField DataField="CategoryName" HeaderText="Category" 
            SortExpression="CategoryName" />
        <asp:BoundField DataField="Description" HeaderText="Description" 
            SortExpression="Description" />
    </Columns>
</asp:GridView>
<asp:ObjectDataSource ID="CategoriesDataSource" runat="server" 
    OldValuesParameterFormatString="original_{0}" SelectMethod="GetCategories" 
    TypeName="CategoriesBLL"></asp:ObjectDataSource>

Gambar 7 ditampilkan Default.aspx saat dilihat melalui browser. Mengklik tautan Lihat Produk kategori membawa Anda ke ProductsByCategory.aspx?CategoryID=categoryID, yang akan kami bangun di Langkah 3.

Setiap Kategori Tercantum Bersama dengan Tautan Tampilkan Produk

Gambar 7: Setiap Kategori Tercantum Bersama dengan Tautan Tampilan Produk (Klik untuk melihat gambar ukuran penuh)

Langkah 3: Mencantumkan Produk Kategori yang Dipilih

ProductsByCategory.aspx Buka halaman dan tambahkan GridView, beri nama ProductsByCategory. Dari tag pintarnya, ikat GridView ke ObjectDataSource baru bernama ProductsByCategoryDataSource. Konfigurasikan ObjectDataSource untuk menggunakan ProductsBLL metode kelas s GetProductsByCategoryID(categoryID) dan atur daftar drop-down ke (Tidak Ada) di tab PERBARUI, SISIPKAN, dan HAPUS.

Gunakan Metode ProductsBLL Class s GetProductsByCategoryID(categoryID)

Gambar 8: Gunakan ProductsBLL Metode Kelas (GetProductsByCategoryID(categoryID)Klik untuk melihat gambar ukuran penuh)

Langkah terakhir dalam wizard Konfigurasi Sumber Data meminta sumber parameter untuk categoryID. Karena informasi ini diteruskan melalui bidang CategoryIDquerystring , pilih QueryString dari daftar drop-down dan masukkan CategoryID di kotak teks QueryStringField seperti yang ditunjukkan pada Gambar 9. Klik Selesai untuk menyelesaikan wizard.

Menggunakan Bidang Querystring CategoryID untuk Parameter categoryID

Gambar 9: Gunakan CategoryID Bidang Querystring untuk parameter categoryID (Klik untuk melihat gambar ukuran penuh)

Setelah menyelesaikan wizard, Visual Studio akan menambahkan BoundFields dan CheckBoxField yang sesuai ke GridView untuk bidang data produk. Hapus semua kecuali ProductName, , UnitPricedan SupplierName BoundFields. Sesuaikan ketiga properti BoundFields HeaderText ini untuk membaca Produk, Harga, dan Pemasok, masing-masing. UnitPrice Format BoundField sebagai mata uang.

Selanjutnya, tambahkan HyperLinkField dan pindahkan ke posisi paling kiri. Atur propertinya Text ke Lihat Detail, propertinya DataNavigateUrlFields ke ProductID, dan propertinya DataNavigateUrlFormatString ke ~/SiteMapProvider/ProductDetails.aspx?ProductID={0}.

Menambahkan Detail Tampilan HyperLinkField yang Menunjuk ke ProductDetails.aspx

Gambar 10: Tambahkan Detail Tampilan HyperLinkField yang Menunjuk ke ProductDetails.aspx

Setelah membuat kustomisasi ini, markup deklaratif GridView dan ObjectDataSource harus menyerupai berikut ini:

<asp:GridView ID="ProductsByCategory" runat="server" AutoGenerateColumns="False"
    DataKeyNames="ProductID" DataSourceID="ProductsByCategoryDataSource" 
    EnableViewState="False">
    <Columns>
        <asp:HyperLinkField DataNavigateUrlFields="ProductID" 
            DataNavigateUrlFormatString=
                "~/SiteMapProvider/ProductDetails.aspx?ProductID={0}"
            Text="View Details" />
        <asp:BoundField DataField="ProductName" HeaderText="Product"
            SortExpression="ProductName" />
        <asp:BoundField DataField="UnitPrice" DataFormatString="{0:c}" 
            HeaderText="Price" HtmlEncode="False" 
            SortExpression="UnitPrice" />
        <asp:BoundField DataField="SupplierName" HeaderText="Supplier" 
            ReadOnly="True" SortExpression="SupplierName" />
    </Columns>
</asp:GridView>
<asp:ObjectDataSource ID="ProductsByCategoryDataSource" runat="server" 
    OldValuesParameterFormatString="original_{0}"
    SelectMethod="GetProductsByCategoryID" TypeName="ProductsBLL">
    <SelectParameters>
        <asp:QueryStringParameter Name="categoryID" 
            QueryStringField="CategoryID" Type="Int32" />
    </SelectParameters>
</asp:ObjectDataSource>

Kembali melihat Default.aspx melalui browser dan klik tautan Lihat Produk untuk Minuman. Ini akan membawa Anda ke ProductsByCategory.aspx?CategoryID=1, menampilkan nama, harga, dan pemasok produk dalam database Northwind yang termasuk dalam kategori Minuman (lihat Gambar 11). Jangan ragu untuk lebih meningkatkan halaman ini untuk menyertakan tautan untuk mengembalikan pengguna ke halaman daftar kategori (Default.aspx) dan kontrol DetailsView atau FormView yang menampilkan nama dan deskripsi kategori yang dipilih.

Nama, Harga, dan Pemasok Minuman Ditampilkan

Gambar 11: Nama, Harga, dan Pemasok Minuman Ditampilkan (Klik untuk melihat gambar ukuran penuh)

Langkah 4: Menampilkan Detail Produk

Halaman akhir, ProductDetails.aspx, menampilkan detail produk yang dipilih. Buka ProductDetails.aspx dan seret DetailsView dari Kotak Alat ke Perancang. Atur properti DetailsView ke IDProductInfo dan hapus nilai properti dan Height miliknyaWidth. Dari tag pintarnya, ikat DetailsView ke ObjectDataSource baru bernama ProductDataSource, mengonfigurasi ObjectDataSource untuk menarik datanya dari ProductsBLL metode kelas.GetProductByProductID(productID) Seperti halnya halaman web sebelumnya yang dibuat di Langkah 2 dan 3, atur daftar drop-down di tab PERBARUI, SISIPKAN, dan HAPUS ke (Tidak Ada) .

Mengonfigurasi ObjectDataSource untuk Menggunakan Metode GetProductByProductID(productID)

Gambar 12: Konfigurasikan ObjectDataSource untuk Menggunakan GetProductByProductID(productID) Metode (Klik untuk melihat gambar ukuran penuh)

Langkah terakhir wizard Konfigurasi Sumber Data meminta sumber parameter productID . Karena data ini datang melalui bidang ProductIDquerystring , atur daftar drop-down ke QueryString dan kotak teks QueryStringField ke ProductID. Terakhir, klik tombol Selesai untuk menyelesaikan wizard.

Mengonfigurasi Parameter productID untuk Menarik Nilainya dari Bidang Querystring ProductID

Gambar 13: Konfigurasikan Parameter productID untuk Menarik Nilainya dari ProductID Bidang Querystring (Klik untuk melihat gambar ukuran penuh)

Setelah menyelesaikan wizard Konfigurasi Sumber Data, Visual Studio akan membuat BoundFields dan CheckBoxField terkait di DetailsView untuk bidang data produk. ProductIDHapus , , SupplierIDdan CategoryID BoundFields dan konfigurasikan bidang yang tersisa sesuai keinginan Anda. Setelah beberapa konfigurasi estetika, markup deklaratif DetailsView dan ObjectDataSource saya terlihat seperti berikut:

<asp:DetailsView ID="ProductInfo" runat="server" AutoGenerateRows="False" 
    DataKeyNames="ProductID" DataSourceID="ProductDataSource" 
    EnableViewState="False">
    <Fields>
        <asp:BoundField DataField="ProductName" HeaderText="Product" 
            SortExpression="ProductName" />
        <asp:BoundField DataField="CategoryName" HeaderText="Category" 
            ReadOnly="True" SortExpression="CategoryName" />
        <asp:BoundField DataField="SupplierName" HeaderText="Supplier" 
            ReadOnly="True" SortExpression="SupplierName" />
        <asp:BoundField DataField="QuantityPerUnit" HeaderText="Qty/Unit" 
            SortExpression="QuantityPerUnit" />
        <asp:BoundField DataField="UnitPrice" DataFormatString="{0:c}" 
            HeaderText="Price" HtmlEncode="False" 
            SortExpression="UnitPrice" />
        <asp:BoundField DataField="UnitsInStock" HeaderText="Units In Stock" 
            SortExpression="UnitsInStock" />
        <asp:BoundField DataField="UnitsOnOrder" HeaderText="Units On Order" 
            SortExpression="UnitsOnOrder" />
        <asp:BoundField DataField="ReorderLevel" HeaderText="Reorder Level" 
            SortExpression="ReorderLevel" />
        <asp:CheckBoxField DataField="Discontinued" HeaderText="Discontinued" 
            SortExpression="Discontinued" />
    </Fields>
</asp:DetailsView>
<asp:ObjectDataSource ID="ProductDataSource" runat="server" 
    OldValuesParameterFormatString="original_{0}"
    SelectMethod="GetProductByProductID" TypeName="ProductsBLL">
    <SelectParameters>
        <asp:QueryStringParameter Name="productID" 
            QueryStringField="ProductID" Type="Int32" />
    </SelectParameters>
</asp:ObjectDataSource>

Untuk menguji halaman ini, kembali ke Default.aspx dan klik Lihat Produk untuk kategori Minuman. Dari daftar produk minuman, klik tautan Lihat Detail untuk Teh Chai. Ini akan membawa Anda ke ProductDetails.aspx?ProductID=1, yang menunjukkan detail Chai Tea (lihat Gambar 14).

Chai Tea s Pemasok, Kategori, Harga, dan Informasi Lainnya Ditampilkan

Gambar 14: Pemasok Teh Chai, Kategori, Harga, dan Informasi Lainnya Ditampilkan (Klik untuk melihat gambar ukuran penuh)

Langkah 5: Memahami Pekerjaan Dalam Penyedia Peta Situs

Peta situs diwakili dalam memori server web sebagai kumpulan SiteMapNode instans yang membentuk hierarki. Harus ada satu akar, semua node non-root harus memiliki satu simpul induk, dan semua simpul mungkin memiliki jumlah anak yang seadanya. Setiap SiteMapNode objek mewakili bagian dalam struktur situs web; bagian ini biasanya memiliki halaman web yang sesuai. Akibatnya, SiteMapNode Ada juga Key properti yang secara unik mengidentifikasi masing-masing SiteMapNode dalam hierarki, serta properti yang digunakan untuk menetapkan hierarki ChildNodesini , , ParentNodeNextSibling, PreviousSibling, dan sebagainya.

Gambar 15 menunjukkan struktur peta situs umum dari Gambar 1, tetapi dengan detail implementasi dibuat sketsa secara lebih detail.

Setiap SiteMapNode memiliki Properti Seperti Judul, Url, Kunci, dan Sebagainya

Gambar 15: Masing-masing SiteMapNode memiliki Properti Seperti Title, Url, Key, dan Sebagainya (Klik untuk melihat gambar ukuran penuh)

Peta situs dapat diakses melalui SiteMap kelas di System.Web namespace layanan. Properti kelas ini RootNode mengembalikan instans akar SiteMapNode peta situs; CurrentNode mengembalikan SiteMapNode properti yang Url cocok dengan URL halaman yang saat ini diminta. Kelas ini digunakan secara internal oleh kontrol Web navigasi ASP.NET 2.0 s.

SiteMap Ketika properti kelas diakses, ia harus menserialisasikan struktur peta situs dari beberapa media persisten ke dalam memori. Namun, logika serialisasi peta situs tidak dikodekan secara permanen ke SiteMap dalam kelas. Sebagai gantinyaSiteMap, pada runtime kelas menentukan penyedia peta situs mana yang akan digunakan untuk serialisasi. Secara default, XmlSiteMapProvider kelas digunakan, yang membaca struktur peta situs dari file XML yang diformat dengan benar. Namun, dengan sedikit pekerjaan, kami dapat membuat penyedia peta situs kustom kami sendiri.

Semua penyedia peta situs harus berasal dari SiteMapProvider kelas , yang mencakup metode dan properti penting yang diperlukan untuk penyedia peta situs, tetapi menghilangkan banyak detail implementasi. Kelas kedua, StaticSiteMapProvider, memperluas SiteMapProvider kelas dan berisi implementasi yang lebih kuat dari fungsionalitas yang diperlukan. Secara internal, menyimpan instans StaticSiteMapProvider peta situs dalam SiteMapNode dan menyediakan metode seperti Hashtable, AddNode(child, parent) dan RemoveNode(siteMapNode), yang menambahkan dan menghapus Clear() ke internal SiteMapNode.Hashtable XmlSiteMapProvider berasal dari StaticSiteMapProvider.

Saat membuat penyedia peta situs kustom yang memperluas StaticSiteMapProvider, ada dua metode abstrak yang harus ditimpa: BuildSiteMap dan GetRootNodeCore. BuildSiteMap, seperti namanya, bertanggung jawab untuk memuat struktur peta situs dari penyimpanan persisten dan membangunnya dalam memori. GetRootNodeCore mengembalikan simpul akar di peta situs.

Sebelum aplikasi web dapat menggunakan penyedia peta situs, aplikasi harus terdaftar dalam konfigurasi aplikasi. Secara default, XmlSiteMapProvider kelas terdaftar menggunakan nama AspNetXmlSiteMapProvider. Untuk mendaftarkan penyedia peta situs tambahan, tambahkan markup berikut ke Web.config:

<configuration>
    <system.web>
        ...
        <siteMap defaultProvider="defaultProviderName">
          <providers>
            <add name="name" type="type" />
          </providers>
        </siteMap>
    </system.web>
</configuration>

Nilai nama menetapkan nama yang dapat dibaca manusia ke penyedia sementara jenis menentukan nama jenis penyedia peta situs yang sepenuhnya memenuhi syarat. Kita akan menjelajahi nilai konkret untuk nama dan mengetik nilai di Langkah 7, setelah kita membuat penyedia peta situs kustom kita.

Kelas penyedia peta situs dibuat saat pertama kali diakses dari SiteMap kelas dan tetap dalam memori selama masa pakai aplikasi web. Karena hanya ada satu instans penyedia peta situs yang dapat dipanggil dari beberapa pengunjung situs web bersamaan, sangat penting bahwa metode penyedia aman untuk utas.

Untuk alasan performa dan skalabilitas, penting bagi kami untuk menyimpan struktur peta situs dalam memori dan mengembalikan struktur cache ini daripada membuatnya kembali setiap kali BuildSiteMap metode dipanggil. BuildSiteMap dapat dipanggil beberapa kali per permintaan halaman per pengguna, tergantung pada kontrol navigasi yang digunakan pada halaman dan kedalaman struktur peta situs. Bagaimanapun, jika kita tidak menyimpan struktur peta situs di BuildSiteMap maka setiap kali dipanggil, kita perlu mengambil kembali informasi produk dan kategori dari arsitektur (yang akan menghasilkan kueri ke database). Seperti yang kita bahas dalam tutorial penembolokan sebelumnya, data yang di-cache dapat menjadi basi. Untuk memerangi ini, kita dapat menggunakan kedaluwarsa berbasis dependensi waktu atau cache SQL.

Catatan

Penyedia peta situs dapat secara opsional mengambil alih Initialize metode . Initialize dipanggil ketika penyedia peta situs pertama kali dibuat dan diteruskan atribut kustom apa pun yang ditetapkan ke penyedia dalam Web.config<add> elemen seperti: <add name="name" type="type" customAttribute="value" />. Ini berguna jika Anda ingin mengizinkan pengembang halaman untuk menentukan berbagai pengaturan terkait penyedia peta situs tanpa harus mengubah kode penyedia. Misalnya, jika kami membaca kategori dan data produk langsung dari database dibandingkan dengan melalui arsitektur, kami mungkin ingin membiarkan pengembang halaman menentukan database string koneksi daripada Web.config menggunakan nilai yang dikodekan secara permanen dalam kode penyedia. Penyedia peta situs kustom yang akan kita buat di Langkah 6 tidak mengambil alih metode ini Initialize . Untuk contoh penggunaan metode ini, lihat Initialize di SQL Server.

Langkah 6: Membuat Penyedia Peta Situs Kustom

Untuk membuat penyedia peta situs kustom yang membangun peta situs dari kategori dan produk di database Northwind, kita perlu membuat kelas yang memperluas StaticSiteMapProvider. Di Langkah 1 saya meminta Anda untuk menambahkan CustomProviders folder di App_Code folder - tambahkan kelas baru ke folder ini bernama NorthwindSiteMapProvider. Tambahkan kode berikut ke kelas NorthwindSiteMapProvider:

Imports System.Web
Imports System.Web.Caching
Public Class NorthwindSiteMapProvider
    Inherits StaticSiteMapProvider
    Private ReadOnly siteMapLock As New Object()
    Private root As SiteMapNode = Nothing
    Public Const CacheDependencyKey As String = "NorthwindSiteMapProviderCacheDependency"
    Public Overrides Function BuildSiteMap() As System.Web.SiteMapNode
        ' Use a lock to make this method thread-safe
        SyncLock siteMapLock
            ' First, see if we already have constructed the
            ' rootNode. If so, return it...
            If root IsNot Nothing Then
                Return root
            End If
            ' We need to build the site map!
            ' Clear out the current site map structure
            MyBase.Clear()
            ' Get the categories and products information from the database
            Dim productsAPI As New ProductsBLL()
            Dim products As Northwind.ProductsDataTable = productsAPI.GetProducts()
            ' Create the root SiteMapNode
            root = New SiteMapNode( _
                Me, "root", "~/SiteMapProvider/Default.aspx", "All Categories")
            AddNode(root)
            ' Create SiteMapNodes for the categories and products
            For Each product As Northwind.ProductsRow In products
                ' Add a new category SiteMapNode, if needed
                Dim categoryKey, categoryName As String
                Dim createUrlForCategoryNode As Boolean = True
                If product.IsCategoryIDNull() Then
                    categoryKey = "Category:None"
                    categoryName = "None"
                    createUrlForCategoryNode = False
                Else
                    categoryKey = String.Concat("Category:", product.CategoryID)
                    categoryName = product.CategoryName
                End If
                Dim categoryNode As SiteMapNode = FindSiteMapNodeFromKey(categoryKey)
                ' Add the category SiteMapNode if it does not exist
                If categoryNode Is Nothing Then
                    Dim productsByCategoryUrl As String = String.Empty
                    If createUrlForCategoryNode Then
                        productsByCategoryUrl = _
                            "~/SiteMapProvider/ProductsByCategory.aspx?CategoryID=" & _
                            product.CategoryID
                    End If
                    categoryNode = New SiteMapNode _
                        (Me, categoryKey, productsByCategoryUrl, categoryName)
                    AddNode(categoryNode, root)
                End If
                ' Add the product SiteMapNode
                Dim productUrl As String = _
                    "~/SiteMapProvider/ProductDetails.aspx?ProductID=" & _
                    product.ProductID
                Dim productNode As New SiteMapNode _
                    (Me, String.Concat("Product:", product.ProductID), _
                    productUrl, product.ProductName)
                AddNode(productNode, categoryNode)
            Next
            ' Add a "dummy" item to the cache using a SqlCacheDependency
            ' on the Products and Categories tables
            Dim productsTableDependency As New _
                System.Web.Caching.SqlCacheDependency("NorthwindDB", "Products")
            Dim categoriesTableDependency As New _
                System.Web.Caching.SqlCacheDependency("NorthwindDB", "Categories")
            ' Create an AggregateCacheDependency
            Dim aggregateDependencies As New System.Web.Caching.AggregateCacheDependency()
            aggregateDependencies.Add(productsTableDependency, categoriesTableDependency)
            ' Add the item to the cache specifying a callback function
            HttpRuntime.Cache.Insert( _
                CacheDependencyKey, DateTime.Now, aggregateDependencies, _
                Cache.NoAbsoluteExpiration, Cache.NoSlidingExpiration, _
                CacheItemPriority.Normal, AddressOf OnSiteMapChanged)
            ' Finally, return the root node
            Return root
        End SyncLock
    End Function
    Protected Overrides Function GetRootNodeCore() As System.Web.SiteMapNode
        Return BuildSiteMap()
    End Function
    Protected Sub OnSiteMapChanged _
    (key As String, value As Object, reason As CacheItemRemovedReason)
        SyncLock siteMapLock
            If String.Compare(key, CacheDependencyKey) = 0 Then
                ' Refresh the site map
                root = Nothing
            End If
        End SyncLock
    End Sub
    Public ReadOnly Property CachedDate() As Nullable(Of DateTime)
        Get
            Dim value As Object = HttpRuntime.Cache(CacheDependencyKey)
            If value Is Nothing OrElse Not TypeOf value Is Nullable(Of DateTime) Then
                Return Nothing
            Else
                Return CType(value, Nullable(Of DateTime))
            End If
        End Get
    End Property
End Class

Mari kita mulai dengan menjelajahi metode kelas BuildSiteMap ini, yang dimulai dengan lock pernyataan. Pernyataan ini lock hanya memungkinkan satu utas pada satu waktu untuk masuk, sehingga menserialisasikan akses ke kodenya dan mencegah dua utas bersamaan menginjak satu sama lain.

Variabel SiteMapNode tingkat root kelas digunakan untuk menyimpan struktur peta situs. Ketika peta situs dibangun untuk pertama kalinya, atau untuk pertama kalinya setelah data yang mendasar telah dimodifikasi, root akan dan Nothing struktur peta situs akan dibangun. Simpul akar peta situs ditetapkan selama root proses konstruksi sehingga lain kali metode ini dipanggil, root tidak akan menjadi Nothing. Akibatnya, selama root tidak Nothing struktur peta situs akan dikembalikan ke pemanggil tanpa harus membuatnya kembali.

Jika root adalah Nothing, struktur peta situs dibuat dari informasi produk dan kategori. Peta situs dibangun dengan membuat SiteMapNode instans lalu membentuk hierarki melalui panggilan ke StaticSiteMapProvider metode kelas s AddNode . AddNode melakukan pembukuan internal, menyimpan berbagai SiteMapNode instans dalam Hashtable. Sebelum kita mulai membangun hierarki, kita mulai dengan memanggil Clear metode , yang menghapus elemen dari internal Hashtable. Selanjutnya, ProductsBLL metode kelas dan GetProducts yang dihasilkan ProductsDataTable disimpan dalam variabel lokal.

Konstruksi peta situs dimulai dengan membuat simpul akar dan menetapkannya ke root. Kelebihan beban konstruktorSiteMapNode digunakan di sini dan di seluruh ini BuildSiteMap diteruskan informasi berikut:

  • Referensi ke penyedia peta situs (Me).
  • s SiteMapNodeKey. Nilai yang diperlukan ini harus unik untuk setiap SiteMapNode.
  • s SiteMapNodeUrl. Url bersifat opsional, tetapi jika disediakan, setiap SiteMapNodeUrl nilai harus unik.
  • SiteMapNode s Title, yang diperlukan.

Panggilan AddNode(root) metode menambahkan ke SiteMapNoderoot peta situs sebagai akar. Selanjutnya, masing-masing ProductRow dalam ProductsDataTable dijumlahkan. Jika sudah ada SiteMapNode untuk kategori produk saat ini, itu dirujuk. Jika tidak, baru SiteMapNode untuk kategori dibuat dan ditambahkan sebagai anak dari SiteMapNode``root melalui AddNode(categoryNode, root) panggilan metode. Setelah node kategori SiteMapNode yang sesuai ditemukan atau dibuat, SiteMapNode dibuat untuk produk saat ini dan ditambahkan sebagai anak dari kategori SiteMapNode melalui AddNode(productNode, categoryNode). Perhatikan bahwa nilai properti kategori SiteMapNode adalah Url~/SiteMapProvider/ProductsByCategory.aspx?CategoryID=categoryID saat properti produk SiteMapNode s Url ditetapkan ~/SiteMapNode/ProductDetails.aspx?ProductID=productID.

Catatan

Produk yang memiliki nilai database NULL untuk mereka CategoryID dikelompokkan di bawah kategori SiteMapNode yang propertinya Title diatur ke Tidak Ada dan yang propertinya Url diatur ke string kosong. Saya memutuskan untuk mengatur Url ke string kosong karena ProductBLL metode kelas s GetProductsByCategory(categoryID) saat ini tidak memiliki kemampuan untuk mengembalikan hanya produk tersebut dengan NULLCategoryID nilai. Selain itu, saya ingin menunjukkan bagaimana kontrol navigasi merender SiteMapNode yang tidak memiliki nilai untuk propertinya Url . Saya mendorong Anda untuk memperluas tutorial ini sehingga properti None SiteMapNode s Url menunjuk ke ProductsByCategory.aspx, namun hanya menampilkan produk dengan NULLCategoryID nilai.

Setelah membuat peta situs, objek arbitrer ditambahkan ke cache data menggunakan dependensi cache SQL pada Categories tabel dan Products melalui AggregateCacheDependency objek. Kami menjelajahi menggunakan dependensi cache SQL dalam tutorial sebelumnya, Menggunakan Dependensi SQL Cache. Namun, penyedia peta situs kustom menggunakan kelebihan beban metode cache Insert data yang belum kami jelajahi. Kelebihan beban ini menerima sebagai parameter input akhirnya delegasi yang dipanggil ketika objek dihapus dari cache. Secara khusus, kami meneruskan delegasiCacheItemRemovedCallback yang menunjuk ke metode yang OnSiteMapChanged ditentukan lebih lanjut di NorthwindSiteMapProvider kelas.

Catatan

Representasi dalam memori peta situs di-cache melalui variabel roottingkat kelas . Karena hanya ada satu instans kelas penyedia peta situs kustom dan karena instans tersebut dibagikan di antara semua utas dalam aplikasi web, variabel kelas ini berfungsi sebagai cache. Metode ini BuildSiteMap juga menggunakan cache data, tetapi hanya sebagai sarana untuk menerima pemberitahuan ketika data database yang mendasar dalam Categories tabel atau Products berubah. Perhatikan bahwa nilai yang dimasukkan ke dalam cache data hanyalah tanggal dan waktu saat ini. Data peta situs aktual tidak dimasukkan ke dalam cache data.

Metode BuildSiteMap selesai dengan mengembalikan simpul akar peta situs.

Metode yang tersisa cukup mudah. GetRootNodeCore bertanggung jawab untuk mengembalikan simpul akar. Karena BuildSiteMap mengembalikan akar, GetRootNodeCore hanya mengembalikan BuildSiteMap nilai pengembalian. Metode OnSiteMapChanged diatur root kembali ke Nothing ketika item cache dihapus. Dengan root diatur kembali ke Nothing, lain kali BuildSiteMap dipanggil, struktur peta situs akan dibangun kembali. Terakhir, CachedDate properti mengembalikan nilai tanggal dan waktu yang disimpan dalam cache data, jika ada nilai seperti itu. Properti ini dapat digunakan oleh pengembang halaman untuk menentukan kapan data peta situs terakhir di-cache.

Langkah 7: MendaftarkanNorthwindSiteMapProvider

Agar aplikasi web kami dapat menggunakan penyedia peta situs yang NorthwindSiteMapProvider dibuat di Langkah 6, kita perlu mendaftarkannya di <siteMap> bagian Web.config. Secara khusus, tambahkan markup berikut dalam <system.web> elemen di Web.config:

<siteMap defaultProvider="AspNetXmlSiteMapProvider">
  <providers>
    <add name="Northwind" type="NorthwindSiteMapProvider" />
  </providers>
</siteMap>

Markup ini melakukan dua hal: pertama, menunjukkan bahwa bawaan AspNetXmlSiteMapProvider adalah penyedia peta situs default; kedua, mendaftarkan penyedia peta situs kustom yang dibuat di Langkah 6 dengan nama northwind yang ramah manusia .

Catatan

Untuk penyedia peta situs yang terletak di folder aplikasi, App_Code nilai type atribut hanyalah nama kelas. Atau, penyedia peta situs kustom dapat dibuat dalam proyek Pustaka Kelas terpisah dengan rakitan yang dikompilasi yang ditempatkan di direktori aplikasi /Bin web. Dalam hal ini, type nilai atribut akan menjadi Namespace.ClassName, AssemblyName .

Setelah memperbarui Web.config, luangkan waktu sejenak untuk melihat halaman apa pun dari tutorial di browser. Perhatikan bahwa antarmuka navigasi di sebelah kiri masih menampilkan bagian dan tutorial yang ditentukan dalam Web.sitemap. Ini karena kami meninggalkan AspNetXmlSiteMapProvider sebagai penyedia default. Untuk membuat elemen antarmuka pengguna navigasi yang menggunakan NorthwindSiteMapProvider, kita harus secara eksplisit menentukan bahwa penyedia peta situs Northwind harus digunakan. Kita akan melihat cara mencapainya di Langkah 8.

Langkah 8: Menampilkan Informasi Peta Situs Menggunakan Penyedia Peta Situs Kustom

Dengan penyedia peta situs kustom dibuat dan terdaftar di Web.config, kami siap untuk menambahkan kontrol navigasi ke Default.aspxhalaman , , ProductsByCategory.aspxdan ProductDetails.aspx di SiteMapProvider folder . Mulailah dengan membuka Default.aspx halaman dan seret SiteMapPath dari Kotak Alat ke Perancang. Kontrol SiteMapPath terletak di bagian Navigasi kotak Alat.

Menambahkan SiteMapPath ke Default.aspx

Gambar 16: Tambahkan SiteMapPath ke Default.aspx (Klik untuk melihat gambar ukuran penuh)

Kontrol SiteMapPath menampilkan breadcrumb, menunjukkan lokasi halaman saat ini dalam peta situs. Kami menambahkan SiteMapPath ke bagian atas halaman master kembali di tutorial Halaman Master dan Navigasi Situs.

Luangkan waktu sejenak untuk melihat halaman ini melalui browser. SiteMapPath yang ditambahkan di Gambar 16 menggunakan penyedia peta situs default, menarik datanya dari Web.sitemap. Oleh karena itu, remah roti menunjukkan Beranda > Menyesuaikan Peta Situs, sama seperti remah roti di sudut kanan atas.

Breadcrumb Menggunakan Penyedia Peta Situs Default

Gambar 17: Breadcrumb Menggunakan Penyedia Peta Situs Default (Klik untuk melihat gambar ukuran penuh)

Agar SiteMapPath ditambahkan di Gambar 16 gunakan penyedia peta situs kustom yang kami buat di Langkah 6, atur propertinya SiteMapProvider ke Northwind, nama yang kami tetapkan ke NorthwindSiteMapProvider dalam .Web.config Sayangnya, Perancang terus menggunakan penyedia peta situs default, tetapi jika Anda mengunjungi halaman melalui browser setelah membuat perubahan properti ini, Anda akan melihat bahwa breadcrumb sekarang menggunakan penyedia peta situs kustom.

Cuplikan layar memperlihatkan bagaimana breadcrumb menampilkan penyedia peta situs kustom.

Gambar 18: Breadcrumb Sekarang Menggunakan Penyedia NorthwindSiteMapProvider Peta Situs Kustom (Klik untuk melihat gambar ukuran penuh)

Kontrol SiteMapPath menampilkan antarmuka pengguna yang lebih fungsional di ProductsByCategory.aspx halaman dan ProductDetails.aspx . Tambahkan SiteMapPath ke halaman ini, atur SiteMapProvider properti di keduanya ke Northwind. Dari Default.aspx klik tautan Lihat Produk untuk Minuman, lalu pada tautan Lihat Detail untuk Teh Chai. Seperti yang ditunjukkan Gambar 19, breadcrumb mencakup bagian peta situs saat ini ( Teh Chai ) dan leluhurnya: Minuman dan Semua Kategori .

Cuplikan layar memperlihatkan bagaimana breadcrumb menampilkan bagian peta situs saat ini (Teh Chai) dan leluhurnya (Minuman dan Semua Kategori).

Gambar 19: Breadcrumb Sekarang Menggunakan Penyedia NorthwindSiteMapProvider Peta Situs Kustom (Klik untuk melihat gambar ukuran penuh)

Elemen antarmuka pengguna navigasi lainnya dapat digunakan selain SiteMapPath, seperti kontrol Menu dan TreeView. Halaman Default.aspx, ProductsByCategory.aspx, dan ProductDetails.aspx dalam unduhan untuk tutorial ini, misalnya, semua menyertakan kontrol Menu (lihat Gambar 20). Lihat bagian Fitur Navigasi Situs Canggih ASP.NET 2.0 dan bagian Menggunakan Kontrol Navigasi Situs dari mulai Cepat ASP.NET 2.0 untuk melihat lebih mendalam kontrol navigasi dan sistem peta situs di ASP.NET 2.0.

Kontrol Menu Mencantumkan Setiap Kategori dan Produk

Gambar 20: Kontrol Menu Mencantumkan Setiap Kategori dan Produk (Klik untuk melihat gambar ukuran penuh)

Seperti disebutkan sebelumnya dalam tutorial ini, struktur peta situs dapat diakses secara terprogram melalui SiteMap kelas . Kode berikut mengembalikan akar SiteMapNode penyedia default:

Dim root As SiteMapNode = SiteMap.RootNode

AspNetXmlSiteMapProvider Karena adalah penyedia default untuk aplikasi kami, kode di atas akan mengembalikan simpul akar yang ditentukan dalam Web.sitemap. Untuk mereferensikan penyedia peta situs selain default, gunakan SiteMap propertiProviders seperti:

Dim root As SiteMapNode = SiteMap.Providers("name").RootNode

Di mana nama adalah nama penyedia peta situs kustom ( Northwind, untuk aplikasi web kami).

Untuk mengakses anggota khusus ke penyedia peta situs, gunakan SiteMap.Providers["name"] untuk mengambil instans penyedia lalu transmisikan ke jenis yang sesuai. Misalnya, untuk menampilkan NorthwindSiteMapProvider properti s CachedDate di halaman ASP.NET, gunakan kode berikut:

Dim customProvider As NorthwindSiteMapProvider = _
    TryCast(SiteMap.Providers("Northwind"), NorthwindSiteMapProvider)
If customProvider IsNot Nothing Then
    Dim lastCachedDate As Nullable(Of DateTime) = customProvider.CachedDate
    If lastCachedDate.HasValue Then
        SiteMapLastCachedDate.Text = _
            "Site map cached on: " & lastCachedDate.Value.ToString()
    Else
        SiteMapLastCachedDate.Text = "The site map is being reconstructed!"
    End If
End If

Catatan

Pastikan untuk menguji fitur dependensi cache SQL. Setelah mengunjungi Default.aspxhalaman , ProductsByCategory.aspx, dan ProductDetails.aspx , buka salah satu tutorial di bagian Mengedit, Menyisipkan, dan Menghapus dan mengedit nama kategori atau produk. Kemudian kembali ke salah satu halaman di SiteMapProvider folder. Dengan asumsi waktu yang cukup telah berlalu untuk mekanisme polling untuk mencatat perubahan pada database yang mendasar, peta situs harus diperbarui untuk menampilkan nama produk atau kategori baru.

Ringkasan

ASP.NET fitur peta situs 2.0 mencakup SiteMap kelas, sejumlah kontrol Web navigasi bawaan, dan penyedia peta situs default yang mengharapkan informasi peta situs tetap ada pada file XML. Untuk menggunakan informasi peta situs dari beberapa sumber lain seperti dari database, arsitektur aplikasi, atau layanan Web jarak jauh, kita perlu membuat penyedia peta situs kustom. Ini melibatkan pembuatan kelas yang berasal, secara langsung atau tidak langsung, dari SiteMapProvider kelas .

Dalam tutorial ini kita melihat cara membuat penyedia peta situs kustom yang didasarkan pada peta situs pada informasi produk dan kategori yang dimusnahkan dari arsitektur aplikasi. Penyedia kami memperluas StaticSiteMapProvider kelas dan membuat BuildSiteMap metode yang mengambil data, membangun hierarki peta situs, dan menyimpan struktur yang dihasilkan dalam variabel tingkat kelas. Kami menggunakan dependensi cache SQL dengan fungsi panggilan balik untuk membatalkan struktur cache saat yang mendasar Categories atau Products data dimodifikasi.

Selamat Pemrograman!

Bacaan lebih lanjut

Untuk informasi selengkapnya tentang topik yang dibahas dalam tutorial ini, lihat sumber daya berikut:

Tentang Penulis

Scott Mitchell, penulis tujuh buku ASP/ASP.NET dan pendiri 4GuysFromRolla.com, telah bekerja sama dengan teknologi Microsoft Web sejak 1998. Scott bekerja sebagai konsultan, pelatih, dan penulis independen. Buku terbarunya adalah Sams Teach Yourself ASP.NET 2.0 dalam 24 Jam. Dia dapat dijangkau di mitchell@4GuysFromRolla.com.

Terima kasih khusus untuk

Seri tutorial ini ditinjau oleh banyak peninjau yang bermanfaat. Peninjau utama untuk tutorial ini adalah Dave Gardner, Zack Jones, Teresa Murphy, dan Bernadette Leigh. Tertarik untuk meninjau artikel MSDN saya yang akan datang? Jika demikian, hubungi saya di mitchell@4GuysFromRolla.com.