Özel Bir Veritabanı Odaklı Site Haritası Sağlayıcısı Oluşturma (C#)

Scott Mitchell tarafından

Kodu indirin veya PDF 'yi indirin

ASP.NET 2,0 ' deki varsayılan site haritası sağlayıcısı, verilerini statik bir XML dosyasından alır. XML tabanlı sağlayıcı çok küçük ve orta ölçekli web sitelerine uygun olsa da, daha büyük web uygulamaları daha dinamik bir site eşlemesi gerektirir. Bu öğreticide, verileri Iş mantığı katmanından alan özel bir site haritası sağlayıcısı oluşturacağız ve bu, verileri veritabanından alır.

Giriş

ASP.NET 2,0 s site haritası özelliği, bir sayfa geliştiricisinin bir XML dosyası gibi bazı kalıcı bir medyada Web uygulaması site haritası tanımlamasına olanak sağlar. Tanımlandıktan sonra, site haritası verilerine System.Web ad alanındaki SiteMap sınıfı aracılığıyla veya (örneğin,, menü ve TreeView denetimleri) çeşitli gezinti Web denetimleri aracılığıyla erişilebilir. Site Haritası sistemi, farklı site haritası serileştirme uygulamalarının oluşturulup bir Web uygulamasına takılabilmesi için sağlayıcı modelini kullanır. ASP.NET 2,0 ile birlikte gelen varsayılan site haritası sağlayıcısı, site haritası yapısını bir XML dosyasında devam ettirir. Ana sayfalar ve site gezinti öğreticisine geri döndüğünüzde, bu yapıyı içeren Web.sitemap adlı bir dosya oluşturdunuz ve kendi XML 'sini her yeni öğretici bölümüyle güncelleştirdik.

Varsayılan XML tabanlı site haritası sağlayıcısı, bu öğreticiler gibi site haritası s yapısı oldukça statikse iyi bir şekilde çalışacaktır. Ancak birçok senaryoda, daha dinamik bir site haritası gerekir. Şekil 1 ' de gösterilen site haritasını göz önünde bulundurun; burada her bir kategori ve ürün, Web sitesi yapısında bölüm olarak görünür. Bu site haritasında, kök düğüme karşılık gelen Web sayfasını ziyaret eden tüm kategoriler listeleyebilir, ancak belirli bir kategorinin bir Web sayfasını ziyaret etmek, bu ürün ve belirli bir ürün Web sayfasını görüntülemek için bu ürün ayrıntılarını gösterir.

Kategori ve ürünlerin site haritası yapısını derleme

Şekil 1: Kategoriler ve ürünler site haritası yapısını derleme (tam boyutlu görüntüyü görüntülemek için tıklatın)

Bu kategori ve ürün tabanlı yapı Web.sitemap dosyasına sabit olarak kodlanmasına karşın, bir kategori veya ürün eklendiğinde, kaldırıldığında veya yeniden adlandırıldığında dosyanın güncellenmesi gerekir. Sonuç olarak, site haritası bakımı, yapısı veritabanından alınırsa veya ideal olarak, uygulama mimarisinin Iş mantığı katmanından büyük ölçüde basitleştirilir. Bu şekilde, ürünler ve Kategoriler eklendikçe, yeniden adlandırıldığı veya silindiği için, site haritası bu değişiklikleri yansıtacak şekilde otomatik olarak güncelleştirilecek.

ASP.NET 2,0 s site haritası serileştirme, sağlayıcı modeline göre oluşturulduğundan, verileri veritabanı veya mimari gibi alternatif bir veri deposundan kullanan kendi özel site haritası sağlayıcımızı oluşturabiliriz. Bu öğreticide, BLL 'den verilerini alan özel bir sağlayıcı oluşturacağız. Haydi başlayın!

Note

Bu öğreticide oluşturulan özel site haritası sağlayıcısı, uygulama mimarisi ve veri modeliyle sıkı bir şekilde bağlanmış. SQL Server ' de site haritalarını depolayan Jeff Prosise s ve makaleler Için bekleyen SQL site haritası sağlayıcısı, site haritası verilerini SQL Server depolamak için genelleştirilmiş bir yaklaşım inceliyor.

Adım 1: özel site haritası sağlayıcı Web sayfaları oluşturma

Özel bir site haritası sağlayıcısı oluşturmaya başlamadan önce, ilk olarak bu öğreticide ihtiyacımız olan ASP.NET sayfaları ekleyelim. SiteMapProvideradlı yeni bir klasör ekleyerek başlayın. Ardından, aşağıdaki ASP.NET sayfalarını bu klasöre ekleyerek her bir sayfayı Site.master ana sayfasıyla ilişkilendirdiğinizden emin olun:

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

Ayrıca, App_Code klasörüne bir CustomProviders alt klasörü ekleyin.

Site Haritası sağlayıcısına ilişkin ASP.NET sayfalarını ekleme-Ilgili öğreticiler

Şekil 2: site haritası sağlayıcısına Ilişkin ASP.NET sayfalarını ekleme-ilgili öğreticiler

Bu bölüm için yalnızca bir öğretici olduğundan, Bölüm öğreticileri hakkında Default.aspx gerekmez. Bunun yerine, Default.aspx kategorileri bir GridView denetiminde görüntüler. 2. adımda bunu ele alacağız.

Sonra, Default.aspx sayfasına bir başvuru eklemek için Web.sitemap güncelleştirin. Özellikle, önbelleğe alma <siteMapNode>sonra aşağıdaki biçimlendirmeyi ekleyin:

<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." />

Web.sitemapgüncelleştirildikten sonra Öğreticiler Web sitesini bir tarayıcıdan görüntülemek için bir dakikanızı ayırın. Sol taraftaki menü artık tek site eşleme sağlayıcısı öğreticisi için bir öğe içeriyor.

Site Haritası artık site haritası sağlayıcısı öğreticisi için bir giriş Içerir

Şekil 3: site haritası artık site haritası sağlayıcısı öğreticisi Için bir giriş içerir

Bu öğretici ana odak, özel bir site haritası sağlayıcısı oluşturmayı ve bu sağlayıcıyı kullanmak için bir Web uygulaması yapılandırmayı göstermektir. Özellikle, Şekil 1 ' de gösterildiği gibi her bir kategori ve ürün için bir düğüm ile birlikte kök düğüm içeren bir site haritası döndüren bir sağlayıcı oluşturacağız. Genel olarak, site eşlemesindeki her düğüm bir URL belirtebilir. Site Haritamız için kök düğüm s URL 'SI ~/SiteMapProvider/Default.aspxolacak ve bu, veritabanındaki tüm kategorileri listeleyebileceğiniz anlamına gelir. Site haritadaki her kategori düğümü, belirtilen CategoryID'deki tüm ürünleri listeleyebileceğiniz ~/SiteMapProvider/ProductsByCategory.aspx?CategoryID=categoryIDişaret eden bir URL 'ye sahip olur. Son olarak, her ürün site haritası düğümü ~/SiteMapProvider/ProductDetails.aspx?ProductID=productIDişaret eder ve bu da belirli ürün ayrıntılarını görüntüler.

Başlamak için Default.aspx, ProductsByCategory.aspxve ProductDetails.aspx sayfalarını oluşturmaya ihtiyacım var. Bu sayfalar sırasıyla 2, 3 ve 4. adımlarda tamamlanır. Bu öğreticinin sahibi site haritası sağlayıcılarında olduğundan ve geçmiş öğreticilerin bu çok sayfalı ana/ayrıntı raporlarının oluşturulmasını kapsadığından, 2 ile 4 arasındaki adımları karşılıyoruz. Birden çok sayfayı kapsayan ana/ayrıntı raporlarını oluştururken bir yenileyici gerekiyorsa, Iki sayfa üzerinde ana/ayrıntı filtrelemesine geri bakın.

2. Adım: kategorilerin listesini görüntüleme

SiteMapProvider klasöründeki Default.aspx sayfasını açın ve araç kutusu 'ndaki bir GridView 'u ID Categoriesolarak ayarlayarak tasarımcı üzerine sürükleyin. GridView s akıllı etiketinden, CategoriesDataSource adlı yeni bir ObjectDataSource 'a bağlayın ve CategoriesBLL sınıf s GetCategories metodunu kullanarak verilerini alması için yapılandırın. Bu GridView yalnızca kategorileri görüntülüyor ve veri değiştirme özellikleri sağlamadığı için GÜNCELLEŞTIRME, ekleme ve SILME sekmelerinden (hiçbiri) açılan listeleri ayarlayın.

, GetCategories metodunu kullanarak kategorileri döndürecek şekilde yapılandırın

Şekil 4: GetCategories yöntemini kullanarak (tam boyutlu görüntüyü görüntülemek Için tıklayın) ObjectDataSource 'ı kategorileri döndürecek şekilde yapılandırın

GÜNCELLEŞTIRME, ekleme ve SILME sekmelerindeki açılan listeleri (hiçbiri) ayarla

Şekil 5: GÜNCELLEŞTIRME, ekleme ve silme sekmelerinden açılan listeleri (yok) ayarlayın (tam boyutlu görüntüyü görüntülemek için tıklayın)

Veri kaynağı Yapılandırma Sihirbazı 'nı tamamladıktan sonra, Visual Studio CategoryID, CategoryName, Description, NumberOfProductsve BrochurePathiçin bir BoundField ekler. GridView 'ı yalnızca CategoryName ve Description BoundFields alanlarını içerecek şekilde düzenleyin ve CategoryName BoundField ' HeaderText özelliğini category olarak güncelleştirin.

Sonra, bir HyperLinkField ekleyin ve bunu en sol alan olacak şekilde konumlandırın. DataNavigateUrlFields özelliğini CategoryID ve DataNavigateUrlFormatString özelliğini ~/SiteMapProvider/ProductsByCategory.aspx?CategoryID={0}olarak ayarlayın. Text özelliğini ürünleri görüntülemek için ayarlayın.

GridView 'a HyperLinkField ekleyin

Şekil 6: Categories GridView 'A HyperLinkField ekleyin

ObjectDataSource oluşturup GridView s alanlarını özelleştirdikten sonra, iki denetim bildirim temelli biçimlendirme aşağıdaki gibi görünür:

<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>

Şekil 7 ' de bir tarayıcıdan görüntülendiklerinde Default.aspx gösterilmektedir. Bir kategori s View Products bağlantısına tıkladığınızda sizi adım 3 ' te oluşturacağız ProductsByCategory.aspx?CategoryID=categoryID.

her kategori bir görünüm ürünleri bağlantısıyla birlikte listelenir

Şekil 7: her kategori bir görünüm ürünleri bağlantısıyla birlikte listelenir (tam boyutlu görüntüyü görüntülemek için tıklayın)

3. Adım: Seçili Kategori ürünlerini listeleme

ProductsByCategory.aspx sayfasını açın ve ProductsByCategoryadlandırarak bir GridView ekleyin. Akıllı etiketinden, GridView 'u ProductsByCategoryDataSourceadlı yeni bir ObjectDataSource 'a bağlayın. ObjectDataSource 'u ProductsBLL sınıf s GetProductsByCategoryID(categoryID) metodunu kullanacak şekilde yapılandırın ve GÜNCELLEŞTIRME, ekleme ve SILME sekmelerinde açılan listeleri (yok) olarak ayarlayın.

ProductsBLL Class s Getproductsbycategoryıd (CategoryID) metodunu kullanın

Şekil 8: ProductsBLL Class s GetProductsByCategoryID(categoryID) metodunu kullanın (tam boyutlu görüntüyü görüntülemek için tıklayın)

Veri kaynağını yapılandırma Sihirbazı ' nda son adım CategoryIDiçin bir parametre kaynağı sorar. Bu bilgiler CategoryIDQueryString alanından geçtiğinden, açılan listeden QueryString ' i seçin ve Şekil 9 ' da gösterildiği gibi QueryStringField metin kutusuna CategoryID yazın. Sihirbazı tamamladığınızda son ' a tıklayın.

CategoryID parametresi için CategoryID QueryString alanını kullanın

Şekil 9: categoryıd parametresi için CategoryID QueryString alanını kullanın (tam boyutlu görüntüyü görüntülemek için tıklayın)

Sihirbaz tamamlandıktan sonra Visual Studio, ürün verileri alanları için ilgili BoundFields ve bir CheckBoxField öğesini GridView 'a ekler. ProductName, UnitPriceve SupplierName BoundFields hariç tümünü kaldırın. Bu üç sınır alanını, sırasıyla ürün, Fiyat ve tedarikçiyi okumak için HeaderText özelleştirin. UnitPrice BoundField öğesini para birimi olarak biçimlendirin.

Sonra, bir HyperLinkField ekleyin ve en soldaki konuma taşıyın. Text özelliğini, ayrıntıları, DataNavigateUrlFields özelliğini ProductIDve DataNavigateUrlFormatString özelliğini ~/SiteMapProvider/ProductDetails.aspx?ProductID={0}olarak görüntülemek için ayarlayın.

ProductDetails. aspx ' i Işaret eden bir görünüm ayrıntıları HyperLinkField ekleyin

Şekil 10: ProductDetails.aspx gösteren bir görünüm ayrıntıları hyperlinkalanı ekleme

Bu özelleştirmeler yapıldıktan sonra, GridView ve ObjectDataSource 'un bildirim temelli işaretlemesi aşağıdakine benzemelidir:

<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>

Default.aspx bir tarayıcı aracılığıyla görüntülemek için geri dönün ve Içecek için ürünleri görüntüle bağlantısına tıklayın. Bu işlem sizi ProductsByCategory.aspx?CategoryID=1, Içgörüleri kategorisine ait olan Northwind veritabanındaki ürünlerin adlarını, fiyatlarını ve tedarikçilerini görmenizi sağlar (bkz. Şekil 11). Bu sayfayı, kullanıcıların Kategori listeleme sayfasına (Default.aspx) ve seçili kategori adı ve açıklamasını görüntüleyen bir DetailsView veya FormView denetimine geri dönmesi için bir bağlantı içermesi için de ücretsiz olarak geliştirebilirsiniz.

Içsi adları, fiyatlar ve tedarikçiler görüntülenir

Şekil 11: içecek adları, fiyatlar ve tedarikçiler görüntülenir (tam boyutlu görüntüyü görüntülemek için tıklayın)

4. Adım: ürün s ayrıntılarını gösterme

Son sayfa ProductDetails.aspx, seçilen ürünlerin ayrıntılarını görüntüler. ProductDetails.aspx açın ve araç kutusundan bir DetailsView öğesini tasarımcı üzerine sürükleyin. DetailsView ID özelliğini ProductInfo olarak ayarlayın ve Height ve Width özellik değerlerini temizleyin. Kendi akıllı etiketinden, ProductDataSourceadlı yeni bir ObjectDataSource 'a bağlayın ve ProductsBLL sınıf s GetProductByProductID(productID) yönteminden verileri çekmek için ObjectDataSource 'u yapılandırın. 2 ve 3. adımlarda oluşturulan önceki Web sayfalarında olduğu gibi, GÜNCELLEŞTIRME, ekleme ve SILME sekmelerinden (hiçbiri) açılan listeleri ayarlayın.

GetProductByProductID (ProductID) yöntemini kullanmak için ObjectDataSource 'ı yapılandırma

Şekil 12: GetProductByProductID(productID) yöntemini kullanmak için ObjectDataSource 'ı yapılandırın (tam boyutlu görüntüyü görüntülemek için tıklayın)

Veri kaynağını yapılandırma sihirbazının son adımı, ProductID parametresinin kaynağını sorar. Bu veriler ProductIDQueryString alanından geldiğinden, açılan listeyi QueryString ve QueryStringField metin kutusunu ProductID olarak ayarlayın. Son olarak, Sihirbazı tamamladıktan sonra son düğmesine tıklayın.

ProductID parametresini, ProductID QueryString alanından değerini çekmek için yapılandırın

Şekil 13: ProductID parametresini, değerini ProductID QueryString alanından çekmek için yapılandırın (tam boyutlu görüntüyü görüntülemek için tıklayın)

Veri kaynağı Yapılandırma Sihirbazı 'nı tamamladıktan sonra, Visual Studio ilgili BoundFields ve ürün verileri alanları için DetailsView içinde bir CheckBoxField oluşturur. ProductID, SupplierIDve CategoryID BoundFields alanlarını kaldırın ve kalan alanları uygun gördüğünüz şekilde yapılandırın. Aesthetic Characteristics yapılandırmalarının, DetailsView 'umun ve ObjectDataSource 'un bildirim temelli biçimlendirmesi aşağıdaki gibi görünmelidir:

<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>

Bu sayfayı test etmek için Default.aspx dönün ve Içecek kategorisi için ürünleri görüntüle ' ye tıklayın. İçecek ürünleri listesinden, Chai Tea için Ayrıntıları görüntüle bağlantısına tıklayın. Bu, bir Chai Tea s ayrıntılarını gösteren ProductDetails.aspx?ProductID=1size götürür (bkz. Şekil 14).

Chai Tea s tedarikçisi, kategori, Fiyat ve diğer bilgiler görüntülenir

Şekil 14: Chai Tea s tedarikçisi, kategori, Fiyat ve diğer bilgiler görüntülenir (tam boyutlu görüntüyü görüntülemek için tıklayın)

5. Adım: bir site haritası sağlayıcısının Iç Işleyişini anlama

Site Haritası, Web sunucusu s bellekte bir hiyerarşi oluşturan SiteMapNode örneklerinin bir koleksiyonu olarak temsil edilir. Tam olarak bir kök olmalı, tüm kök olmayan düğümlerin tam olarak bir üst düğümü olmalıdır ve tüm düğümlerde rastgele sayıda alt öğe olabilir. Her SiteMapNode nesnesi, Web sitesi yapısındaki bir bölümü temsil eder; Bu bölümlerin genellikle karşılık gelen bir Web sayfası vardır. Sonuç olarak, SiteMapNode sınıfı Title, Urlve Descriptiongibi özelliklere sahiptir ve SiteMapNode temsil ettiği bölüm için bilgi sağlar. Ayrıca hiyerarşideki her bir SiteMapNode benzersiz bir şekilde tanımlayan bir Key özelliği vardır ve bu hiyerarşiyi ChildNodes, ParentNode, NextSibling, PreviousSibling, vb. oluşturmak için kullanılan özellikleri de vardır.

Şekil 15, Şekil 1 ' den genel site haritası yapısını gösterir, ancak uygulama ayrıntıları daha ayrıntılı bir şekilde taslak yapılır.

her bir SiteMapNode 'un başlık, URL, anahtar ve benzeri özellikleri vardır

Şekil 15: her SiteMapNode Title, Url, Keyvb. gibi özelliklere sahiptir (tam boyutlu görüntüyü görüntülemek için tıklayın)

Site haritasına, System.Web ad alanındaki SiteMap sınıfı aracılığıyla erişilebilir. Bu sınıf RootNode özelliği, site haritası kök SiteMapNode örneğini döndürür; CurrentNode, Url özelliği şu anda istenen sayfanın URL 'siyle eşleşen SiteMapNode döndürür. Bu sınıf, ASP.NET 2,0 s gezinti Web denetimleri tarafından dahili olarak kullanılır.

SiteMap sınıfı özelliklerine erişildiğinde, site eşleme yapısını bazı kalıcı ortamdan belleğe serileştirmelidir. Ancak, site haritası serileştirme mantığı SiteMap sınıfına sabit olarak kodlanmaz. Bunun yerine, çalışma zamanında SiteMap sınıfı, serileştirme için hangi site eşleme sağlayıcısını kullanacağınızı belirler. Varsayılan olarak, XmlSiteMapProvider sınıfı kullanılır ve bu, site haritası yapısını düzgün BIÇIMLI bir XML dosyasından okur. Ancak, biraz iş sayesinde kendi özel site haritası sağlayıcımızı oluşturarız.

Tüm site haritası sağlayıcılarının, site haritası sağlayıcıları için gereken temel yöntemleri ve özellikleri içeren SiteMapProvider sınıfındantüretilmesi gerekir, ancak uygulama ayrıntılarının çoğunu atlar. İkinci bir sınıf, StaticSiteMapProviderSiteMapProvider sınıfını genişletir ve gerekli işlevselliğin daha sağlam bir uygulamasını içerir. Dahili olarak StaticSiteMapProvider, site haritasının SiteMapNode örneklerini bir Hashtable depolar ve AddNode(child, parent), RemoveNode(siteMapNode), ve Clear() SiteMapNodeHashtableekleyen ve çıkarmış yöntemler sağlar. XmlSiteMapProvider StaticSiteMapProvidertüretilir.

StaticSiteMapProvidergenişleten özel bir site eşleme sağlayıcısı oluştururken, geçersiz kılınabilmesi gereken iki Soyut yöntem vardır: BuildSiteMap ve GetRootNodeCore. BuildSiteMap, adının gösterdiği gibi, site haritası yapısının kalıcı depolamadan yüklenmesi ve bellekte oluşturulduğundan sorumludur. GetRootNodeCore, site eşlemesindeki kök düğümü döndürür.

Bir Web uygulamasının bir site haritası sağlayıcısı kullanabilmesi için önce uygulama yapılandırması 'nda kayıtlı olması gerekir. Varsayılan olarak, XmlSiteMapProvider sınıfı AspNetXmlSiteMapProvideradı kullanılarak kaydedilir. Ek site eşleme sağlayıcılarını kaydetmek için aşağıdaki biçimlendirmeyi Web.configekleyin:

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

Ad değeri, sağlayıcıya okunabilir bir ad atar, ancak tür , site eşleme sağlayıcısının tam nitelikli tür adını belirtir. Özel site haritası sağlayıcımız oluşturulduktan sonra, adım 7 ' de ad ve tür değerlerinin somut değerlerini keşfedeceğiz.

Site haritası sağlayıcısı sınıfı, ilk kez SiteMap sınıfından erişildiğinde oluşturulur ve Web uygulamasının ömrü boyunca bellekte kalır. Site haritası sağlayıcısının birden çok, eşzamanlı Web sitesi ziyaretçilerinden çağrılabileceği yalnızca bir örneği olduğundan, sağlayıcı yöntemlerinin iş parçacığı açısından güvenliolması zorunludur.

Performans ve ölçeklenebilirlik nedenleriyle, bellek içi site eşleme yapısını önbelleğe aldık ve BuildSiteMap yöntemi her çağrıldığında bu önbelleğe alınmış yapıyı döndürmemiz önemlidir. BuildSiteMap, sayfada kullanımda olan gezinti denetimlerine ve site haritası yapısının derinliğine bağlı olarak, her kullanıcı için sayfa isteği başına birkaç kez çağrılabilir. Herhangi bir durumda, BuildSiteMap ' de site eşleme yapısını önbelleğe almadığımızda, her çağrıldığında, mimariden ürün ve kategori bilgilerini yeniden almanız gerekir (Bu, veritabanına bir sorgu oluşmasına neden olur). Önceki önbelleğe alma öğreticilerinde anlatıldığı gibi, önbelleğe alınan veriler eski hale gelebilir. Bunu yapmak için, ya zaman ya da SQL önbellek bağımlılığı tabanlı expiries 'yi kullanabiliriz.

Note

Bir site haritası sağlayıcısı, isteğe bağlı olarak Initialize yöntemigeçersiz kılabilir. Initialize, site eşleme sağlayıcısı ilk kez başlatıldığında ve şu gibi <add> öğesinde Web.config sağlayıcıya atanmış özel öznitelikleri geçirildiğinde çağrılır: <add name="name" type="type" customAttribute="value" />. Bir sayfa geliştiricisinin, sağlayıcı kodunu değiştirmek zorunda kalmadan çeşitli site haritası sağlayıcısıyla ilgili ayarları belirtmesini sağlamak istiyorsanız kullanışlıdır. Örneğin, kategori ve ürün verilerini mimarinin ötesinde doğrudan veritabanından okuuyoruz, büyük olasılıkla sayfa geliştiricisinin, sağlayıcı kodunda sabit kodlanmış bir değer kullanmak yerine Web.config aracılığıyla veritabanı bağlantı dizesini belirtmesini sağlamak istiyoruz. Adım 6 ' da derlenecek özel site haritası sağlayıcısı bu Initialize metodunu geçersiz kılmaz. Initialize yönteminin kullanılmasına ilişkin bir örnek için, site haritalarını SQL Server makalesinde depolayan Jeff Prosise s bölümüne bakın.

6. Adım: özel site haritası sağlayıcısı oluşturma

Northwind veritabanındaki Kategoriler ve ürünlerden site haritasını oluşturan özel bir site haritası sağlayıcısı oluşturmak için, StaticSiteMapProvidergenişleten bir sınıf oluşturuyoruz. Adım 1 ' de App_Code klasörüne CustomProviders klasör eklemenizi istedi. bu klasöre NorthwindSiteMapProvideradlı yeni bir sınıf ekleyin. NorthwindSiteMapProvider sınıfına aşağıdaki kodu ekleyin:

using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Web.Caching;
public class NorthwindSiteMapProvider : StaticSiteMapProvider
{
    private readonly object siteMapLock = new object();
    private SiteMapNode root = null;
    public const string CacheDependencyKey = 
        "NorthwindSiteMapProviderCacheDependency";
    public override SiteMapNode BuildSiteMap()
    {
        // Use a lock to make this method thread-safe
        lock (siteMapLock)
        {
            // First, see if we already have constructed the
            // rootNode. If so, return it...
            if (root != null)
                return root;
            // We need to build the site map!
            
            // Clear out the current site map structure
            base.Clear();
            // Get the categories and products information from the database
            ProductsBLL productsAPI = new ProductsBLL();
            Northwind.ProductsDataTable products = productsAPI.GetProducts();
            // Create the root SiteMapNode
            root = new SiteMapNode(
                this, "root", "~/SiteMapProvider/Default.aspx", "All Categories");
            AddNode(root);
            // Create SiteMapNodes for the categories and products
            foreach (Northwind.ProductsRow product in products)
            {
                // Add a new category SiteMapNode, if needed
                string categoryKey, categoryName;
                bool createUrlForCategoryNode = true;
                if (product.IsCategoryIDNull())
                {
                    categoryKey = "Category:None";
                    categoryName = "None";
                    createUrlForCategoryNode = false;
                }
                else
                {
                    categoryKey = string.Concat("Category:", product.CategoryID);
                    categoryName = product.CategoryName;
                }
                SiteMapNode categoryNode = FindSiteMapNodeFromKey(categoryKey);
                // Add the category SiteMapNode if it does not exist
                if (categoryNode == null)
                {
                    string productsByCategoryUrl = string.Empty;
                    if (createUrlForCategoryNode)
                        productsByCategoryUrl = 
                            "~/SiteMapProvider/ProductsByCategory.aspx?CategoryID=" 
                            + product.CategoryID;
                    categoryNode = new SiteMapNode(
                        this, categoryKey, productsByCategoryUrl, categoryName);
                    AddNode(categoryNode, root);
                }
                // Add the product SiteMapNode
                string productUrl = 
                    "~/SiteMapProvider/ProductDetails.aspx?ProductID=" 
                    + product.ProductID;
                SiteMapNode productNode = new SiteMapNode(
                    this, string.Concat("Product:", product.ProductID), 
                    productUrl, product.ProductName);
                AddNode(productNode, categoryNode);
            }
            
            // Add a "dummy" item to the cache using a SqlCacheDependency
            // on the Products and Categories tables
            System.Web.Caching.SqlCacheDependency productsTableDependency = 
                new System.Web.Caching.SqlCacheDependency("NorthwindDB", "Products");
            System.Web.Caching.SqlCacheDependency categoriesTableDependency = 
                new System.Web.Caching.SqlCacheDependency("NorthwindDB", "Categories");
            // Create an AggregateCacheDependency
            System.Web.Caching.AggregateCacheDependency aggregateDependencies = 
                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, 
                new CacheItemRemovedCallback(OnSiteMapChanged));
            // Finally, return the root node
            return root;
        }
    }
    protected override SiteMapNode GetRootNodeCore()
    {
        return BuildSiteMap();
    }
    protected void OnSiteMapChanged(string key, object value, CacheItemRemovedReason reason)
    {
        lock (siteMapLock)
        {
            if (string.Compare(key, CacheDependencyKey) == 0)
            {
                // Refresh the site map
                root = null;
            }
        }
    }
    public DateTime? CachedDate
    {
        get
        {
            return HttpRuntime.Cache[CacheDependencyKey] as DateTime?;
        }
    }
}

Bir lock bildirimiylebaşlayan bu sınıf BuildSiteMap yöntemini keşfetmeye başlayın. lock deyimleri, tek seferde yalnızca bir iş parçacığının girmesine izin verir, böylece koda erişimi serileştirmesini ve iki eş zamanlı iş parçacığının başka bir yerde adımlanmasını önler.

Sınıf düzeyi SiteMapNode değişken root, site haritası yapısını önbelleğe almak için kullanılır. Site Haritası ilk kez oluşturulduğunda veya temel alınan veriler değiştirildikten sonra ilk kez için root null olur ve site haritası yapısı oluşturulur. Site Haritası kök düğümü oluşturma işlemi sırasında root atandığında, bu yöntemin bir sonraki çağrılışında root nullolmayacaktır. Sonuç olarak, root null olmadığı sürece site haritası yapısı yeniden oluşturmak zorunda kalmadan çağırana döndürülür.

Kök null, site haritası yapısı ürün ve kategori bilgileri ' nden oluşturulur. Site Haritası, SiteMapNode örnekleri oluşturularak oluşturulur ve ardından hiyerarşi StaticSiteMapProvider sınıf s AddNode metoduna çağrılar aracılığıyla oluşturulur. AddNode, assıralanan SiteMapNode örneklerini bir Hashtabledepolayarak iç muhasebeci gerçekleştirir. Hiyerarşiyi oluşturmadan önce, iç Hashtableöğeleri temizleyen Clear yöntemini çağırarak başladık. Sonra, ProductsBLL sınıf s GetProducts yöntemi ve elde edilen ProductsDataTable yerel değişkenlerde saklanır.

Site Haritası oluşturma işlemi, kök düğümü oluşturup rootatamaya başlar. Burada kullanılan SiteMapNode s oluşturucusunun aşırı yüklemesi ve bu BuildSiteMap boyunca aşağıdaki bilgiler geçirilir:

  • Site eşleme sağlayıcısına (this) yönelik bir başvuru.
  • SiteMapNode s Key. Bu gerekli değer her SiteMapNodeiçin benzersiz olmalıdır.
  • SiteMapNode s Url. Url isteğe bağlıdır, ancak sağlanmışsa, her SiteMapNode s Url değeri benzersiz olmalıdır.
  • Gerekli olan SiteMapNode s Title.

AddNode(root) yöntemi çağrısı, SiteMapNode root site eşlemesine kök olarak ekler. Sonra, ProductsDataTable her ProductRow numaralandırılır. Geçerli ürün kategorisi için zaten bir SiteMapNode varsa, buna başvurulur. Aksi takdirde, kategori için yeni bir SiteMapNode oluşturulur ve AddNode(categoryNode, root) yöntem çağrısıyla SiteMapNode``root alt öğesi olarak eklenir. Uygun kategori SiteMapNode düğüm bulduktan veya oluşturulduktan sonra, geçerli ürün için bir SiteMapNode oluşturulur ve AddNode(productNode, categoryNode)aracılığıyla kategori SiteMapNode alt öğesi olarak eklenir. SiteMapNode s Url Özellik değeri, ürün SiteMapNode s Url özelliği atandığında ~/SiteMapProvider/ProductsByCategory.aspx?CategoryID=categoryID olduğunu unutmayın.~/SiteMapNode/ProductDetails.aspx?ProductID=productID

Note

CategoryID için bir veritabanı NULL değeri olan ürünler, Title özelliği None olarak ayarlanmış ve Url özelliği boş bir dizeye ayarlanmış olan bir kategori SiteMapNode altında gruplandırılır. ProductBLL sınıf s GetProductsByCategory(categoryID) yöntemi şu anda yalnızca bir NULL CategoryID değeri olan ürünleri döndürme özelliği olmadığından, Url boş bir dizeye ayarlamaya karar verdim. Ayrıca, gezinti denetimlerinin, Url özelliği için bir değer olmayan bir SiteMapNode nasıl işlemesini göstermek istiyordum. Bu öğreticiyi genişletmenize, None SiteMapNode s Url özelliğinin ProductsByCategory.aspxişaret edebilmesi için, ancak yalnızca NULL CategoryID değerleri olan ürünleri görüntülerimize teşvik ediyorum.

Site Haritası oluşturulduktan sonra, Categories bir SQL önbellek bağımlılığı kullanılarak veri önbelleğine rastgele bir nesne eklenir ve bir AggregateCacheDependency nesnesi aracılığıyla tabloları Products. SQL önbellek bağımlılıklarını kullanarakönceki öğreticide SQL önbellek bağımlılıklarını araştırdık. Ancak, özel site haritası sağlayıcısı, henüz araştırdığımız veri önbelleği s Insert yönteminin bir aşırı yüklemesini kullanır. Bu aşırı yükleme, nesne önbellekten kaldırıldığında çağrılan bir temsilciyi son giriş parametresi olarak kabul eder. Özellikle, NorthwindSiteMapProvider sınıfında daha sonra tanımlanan OnSiteMapChanged yöntemine işaret eden yeni bir CacheItemRemovedCallback temsilcisi geçiririz.

Note

Site haritasının bellek içi temsili rootsınıf düzeyi değişken aracılığıyla önbelleğe alınır. Özel site haritası sağlayıcısı sınıfının yalnızca bir örneği olduğundan ve bu örnek Web uygulamasındaki tüm iş parçacıkları arasında paylaşıldığından, bu sınıf değişkeni bir önbellek görevi görür. BuildSiteMap yöntemi veri önbelleğini de kullanır, ancak yalnızca Categories veya Products tablolarında temel alınan veritabanı verileri değiştiğinde bildirim alma anlamına gelir. Veri önbelleğine yerleştirdiğiniz değerin yalnızca geçerli tarih ve saat olduğunu unutmayın. Gerçek site haritası verileri veri önbelleğine yerleştirmez .

BuildSiteMap yöntemi, site haritasının kök düğümünü döndürerek tamamlanır.

Kalan Yöntemler oldukça basittir. GetRootNodeCore kök düğümü döndürmekten sorumludur. BuildSiteMap kök döndürdüğünden GetRootNodeCore yalnızca BuildSiteMap s dönüş değeri döndürür. OnSiteMapChanged yöntemi, önbellek öğesi kaldırıldığında null geri root ayarlar. Kök null, BuildSiteMap bir sonraki çağrılışında, site haritası yapısı yeniden oluşturulur. Son olarak, CachedDate özelliği, bu tür bir değer varsa veri önbelleğinde depolanan tarih ve saat değerini döndürür. Bu özellik, site haritası verilerinin son ne zaman önbelleğe alındığını öğrenmek için bir sayfa geliştiricisi tarafından kullanılabilir.

7. Adım:NorthwindSiteMapProvider kaydetme

Web uygulamamız 6. adımda oluşturulan NorthwindSiteMapProvider site eşleme sağlayıcısını kullanmak için, bunu Web.config``<siteMap> bölümüne kaydetmemiz gerekir. Özel olarak, aşağıdaki biçimlendirmeyi Web.config``<system.web> öğesi içine ekleyin:

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

Bu biçimlendirme iki şeyi yapar: ilk olarak, yerleşik AspNetXmlSiteMapProvider varsayılan site eşleme sağlayıcısı olduğunu belirtir; İkincisi, adım 6 ' da oluşturulan özel site eşleme sağlayıcısını, çok daha fazla Northwind adıyla kaydeder.

Note

Uygulama s App_Code klasöründe bulunan site haritası sağlayıcıları için, type özniteliğinin değeri yalnızca sınıf adıdır. Alternatif olarak, özel site eşleme sağlayıcısı derlenmiş bütünleştirilmiş kod ile Web uygulaması /Bin dizinine yerleştirilmiş ayrı bir sınıf kitaplığı projesinde oluşturulmuş olabilir. Bu durumda, type özniteliği değeri ad alanıolacaktır. ClassName, AssemblyName .

Web.configgüncelleştirildikten sonra, bir tarayıcıda öğreticilerden herhangi bir sayfayı görüntülemek için bir dakikanızı ayırın. Soldaki gezinti arabiriminin hala Web.sitemaptanımlanan bölümleri ve öğreticileri gösterdiğini unutmayın. Bunun nedeni, varsayılan sağlayıcı olarak AspNetXmlSiteMapProvider soluyoruz. NorthwindSiteMapProviderkullanan bir gezinti kullanıcı arabirimi öğesi oluşturmak için, Northwind site haritası sağlayıcısının kullanılması gerektiğini açıkça belirtmemiz gerekir. Bunu adım 8 ' de nasıl gerçekleştireceğiz.

8. Adım: özel site haritası sağlayıcısını kullanarak site haritası bilgilerini görüntüleme

Web.config, özel site eşleme sağlayıcısı oluşturulup kayıtlı Default.aspx, ProductsByCategory.aspxve ProductDetails.aspx SiteMapProvider sayfalarına gezinti denetimleri eklemeye hazırız. Default.aspx sayfasını açıp araç kutusundan bir SiteMapPath sürükleyip tasarımcı üzerine sürükleyin. Bu denetim kutusu, araç kutusunun Gezinti bölümünde bulunur.

varsayılan. aspx 'e bir değer ekler

Şekil 16: Default.aspx Için bir fite ekleme (tam boyutlu görüntüyü görüntülemek için tıklayın)

Bu denetim, site haritası içindeki geçerli sayfa konumunu gösteren bir içerik haritası görüntüler. Ana sayfa ve site gezinti öğreticisinde ana sayfanın en üstüne bir

Bu sayfayı bir tarayıcı aracılığıyla görüntülemek için bir dakikanızı ayırın. Şekil 16 ' da eklenen bu, varsayılan site haritası sağlayıcısını kullanır ve Web.sitemapverilerini çekmesini kullanır. Bu nedenle, içerik haritası, sağ üst köşedeki içerik haritasında olduğu gibi, site haritasını özelleştiren giriş > gösterir.

Içerik Haritası varsayılan site haritası sağlayıcısını kullanır

Şekil 17: Içerik Haritası varsayılan site haritası sağlayıcısını kullanır (tam boyutlu görüntüyü görüntülemek için tıklayın)

Değer 1 ' in şekil 16 ' da eklenmesini sağlamak için, 6. adımda oluşturduğumuz özel site haritası sağlayıcısını kullanın, SiteMapProvider özelliğini , Web.config``NorthwindSiteMapProvider atandığımız adı Northwind olarak ayarlayın. Ne yazık ki tasarımcı varsayılan site haritası sağlayıcısını kullanmaya devam eder, ancak bu özellik değişikliğini yaptıktan sonra sayfayı bir tarayıcı aracılığıyla ziyaret ederseniz, içerik haritası 'nın artık özel site haritası sağlayıcısını kullandığını görürsünüz.

Içerik Haritası artık özel site haritası sağlayıcısını kullanıyor.

Şekil 18: Içerik Haritası artık özel site haritası sağlayıcısını kullanır NorthwindSiteMapProvider (tam boyutlu görüntüyü görüntülemek için tıklayın)

Bu denetim ProductsByCategory.aspx ve ProductDetails.aspx sayfalarında daha işlevsel bir kullanıcı arabirimi görüntüler. Bu sayfalara bir, SiteMapProvider özelliğini Northwind olarak ayarlayarak bu sayfalara bir Default.aspx, Içecek için ürünleri görüntüle bağlantısına tıklayın ve ardından Chai Tea için Ayrıntıları görüntüle bağlantısını tıklatın. Şekil 19 ' u gösterdiği gibi, içerik haritası geçerli site haritası bölümünü (Chai Tea) ve bunların üst öğelerini içerir: Içecek ve tüm kategoriler.

Içerik Haritası artık özel site haritası sağlayıcısını kullanıyor.

Şekil 19: Içerik Haritası artık özel site haritası sağlayıcısını kullanır NorthwindSiteMapProvider (tam boyutlu görüntüyü görüntülemek için tıklayın)

Diğer gezinti kullanıcı arabirimi öğeleri, bu, menü ve TreeView denetimleri gibi, için de kullanılabilir. Bu öğreticide karşıdan yüklenebilecek Default.aspx, ProductsByCategory.aspxve ProductDetails.aspx sayfaları (örneğin, tüm menü denetimleri dahil) (bkz. Şekil 20). ASP.NET 2,0 içindeki gezinti denetimleri ve site haritası sistemine daha ayrıntılı bir bakış için bkz. ASP.NET 2,0 s site gezinti özelliklerini inceleme ve ASP.NET 2,0 quickbaşlangıçları 'Nın site gezinti denetimlerini kullanma bölümü.

Menü Denetim kategorilerin ve ürünlerin her birini listeler

Şekil 20: menü denetimi kategorilerin ve ürünlerin her birini listeler (tam boyutlu görüntüyü görüntülemek için tıklayın)

Bu öğreticide daha önce bahsedildiği gibi, site haritası yapısına SiteMap sınıfı aracılığıyla programlı olarak erişilebilir. Aşağıdaki kod, Varsayılan sağlayıcının kök SiteMapNode döndürür:

SiteMapNode root = SiteMap.RootNode;

AspNetXmlSiteMapProvider, uygulamamız için varsayılan sağlayıcıda olduğundan, yukarıdaki kod Web.sitemaptanımlanan kök düğümü döndürür. Varsayılan dışında bir site eşleme sağlayıcısına başvurmak için, şunun gibi SiteMap sınıf s Providers özelliğini kullanın:

SiteMapNode root = SiteMap.Providers["name"].RootNode;

Burada ad , özel site haritası sağlayıcısının adıdır (web uygulamamız için Northwind).

Bir site haritası sağlayıcısına özgü bir üyeye erişmek için, sağlayıcı örneğini almak ve sonra uygun türe dönüştürmek için SiteMap.Providers["name"] kullanın. Örneğin, NorthwindSiteMapProvider s CachedDate özelliğini bir ASP.NET sayfasında göstermek için aşağıdaki kodu kullanın:

NorthwindSiteMapProvider customProvider = 
    SiteMap.Providers["Northwind"] as NorthwindSiteMapProvider;
if (customProvider != null)
{
    DateTime? lastCachedDate = customProvider.CachedDate;
    if (lastCachedDate != null)
        LabelID.Text = "Site map cached on: " + lastCachedDate.Value.ToString();
    else
        LabelID.Text = "The site map is being reconstructed!";
}

Note

SQL önbellek bağımlılığı özelliğini test ettiğinizden emin olun. Default.aspx, ProductsByCategory.aspxve ProductDetails.aspx sayfalarını ziyaret ettikten sonra düzenleme, ekleme ve silme bölümündeki öğreticilerden birine gidin ve bir kategorinin ya da ürünün adını düzenleyin. Sonra SiteMapProvider klasöründeki sayfalardan birine geri dönün. Yoklama mekanizmasına, temel alınan veritabanında yapılan değişikliği göz önünde bulunduracak kadar geçen sürenin geçtiğini varsayarsak, site haritasının yeni ürün veya kategori adını gösterecek şekilde güncellenmesi gerekir.

Özet

ASP.NET 2,0 s site eşleme özellikleri, bir SiteMap sınıfı, yerleşik gezinti Web denetimleri ve bir XML dosyası için kalıcı site eşleme bilgilerini bekleyen bir varsayılan site haritası sağlayıcısı içerir. Site haritası bilgilerini bir veritabanı, uygulama mimarisi veya uzak Web hizmeti gibi başka bir kaynaktan kullanmak için özel bir site haritası sağlayıcısı oluşturulması gerekir. Bu, SiteMapProvider sınıfından doğrudan veya dolaylı olarak türetilen bir sınıf oluşturmayı içerir.

Bu öğreticide, ürün ve kategori bilgileri uygulama mimarisinden bağımsız olarak site haritasını temel alan özel bir site haritası sağlayıcısı oluşturmayı gördük. Sağlayıcımız StaticSiteMapProvider sınıfını genişletti ve verileri alan, site haritası hiyerarşisini oluşturan ve elde edilen yapıyı sınıf düzeyi bir değişkende önbelleğe alan bir BuildSiteMap yöntemi oluşturmayı planladı. Temel alınan Categories veya Products verileri değiştirildiğinde önbelleğe alınmış yapıyı geçersiz kılmak için bir geri çağırma işleviyle birlikte bir SQL önbellek bağımlılığı kullandık.

Programlamanın kutlu olsun!

Daha Fazla Bilgi

Bu öğreticide ele alınan konular hakkında daha fazla bilgi için aşağıdaki kaynaklara bakın:

Yazar hakkında

4GuysFromRolla.com 'in, Scott Mitchell, yedi ASP/ASP. net books ve 'in yazarı, 1998 sürümünden bu yana Microsoft Web teknolojileriyle çalışmaktadır. Scott bağımsız danışman, Trainer ve yazıcı olarak çalışıyor. En son kitabı, 24 saat içinde ASP.NET 2,0 kendi kendinize eğitimister. mitchell@4GuysFromRolla.comadresinden erişilebilir . ya da blog aracılığıyla http://ScottOnWriting.NETbulabilirsiniz.

Özel olarak teşekkürler

Bu öğretici serisi birçok yararlı gözden geçirenler tarafından incelendi. Bu öğreticide lider gözden geçirenler, Gardner, Zack Jones, Teresa Murphy ve Bernadette Leigh. Yaklaşan MSDN makalelerimi gözden geçiriyor musunuz? Öyleyse, benimitchell@4GuysFromRolla.combir satır bırakın .