Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
oleh Scott Mitchell
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.
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 .
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.
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.aspx
halaman , 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) .
Gambar 4: Konfigurasikan ObjectDataSource untuk Mengembalikan Kategori Menggunakan GetCategories
Metode (Klik untuk melihat gambar ukuran penuh)
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
, , CategoryName
Description
, 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 .
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.
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.
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 CategoryID
querystring , pilih QueryString dari daftar drop-down dan masukkan CategoryID di kotak teks QueryStringField seperti yang ditunjukkan pada Gambar 9. Klik Selesai untuk menyelesaikan wizard.
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
, , UnitPrice
dan 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}
.
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.
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 ID
ProductInfo
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) .
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 ProductID
querystring , atur daftar drop-down ke QueryString dan kotak teks QueryStringField ke ProductID. Terakhir, klik tombol Selesai untuk menyelesaikan wizard.
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.
ProductID
Hapus , , SupplierID
dan 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).
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 ChildNodes
ini , , ParentNode
NextSibling
, PreviousSibling
, dan sebagainya.
Gambar 15 menunjukkan struktur peta situs umum dari Gambar 1, tetapi dengan detail implementasi dibuat sketsa secara lebih detail.
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
SiteMapNode
Key
. Nilai yang diperlukan ini harus unik untuk setiapSiteMapNode
. - s
SiteMapNode
Url
.Url
bersifat opsional, tetapi jika disediakan, setiapSiteMapNode
Url
nilai harus unik. -
SiteMapNode
sTitle
, yang diperlukan.
Panggilan AddNode(root)
metode menambahkan ke SiteMapNode
root
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 NULL
CategoryID
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 NULL
CategoryID
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 root
tingkat 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.aspx
halaman , , ProductsByCategory.aspx
dan 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.
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.
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.
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 .
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.
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.aspx
halaman , 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:
- Menyimpan Peta Situs di SQL Server dan Penyedia Peta Situs SQL yang Telah Anda Tunggu
- Toolkit Penyedia
- ASP.NET Fitur Navigasi Situs Canggih ASP.NET 2.0
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.