Makale Özeti

Bu makalemizde ASP.NET 2.0 ile birlikte gelen sitemap dosyasının ve navigasyon kontrollerinin bilinmeyen yönlerine bakacağız. Site haritasındaki belirli kısımları görüntüleme, site haritasına özel bilgiler ekleme, SiteMap nesnesinin kullanımı ve bir sitede birden fazla sitemap dosyasının kullanımını ne şekilde gerçekleştirebileceğimizi göreceğiz.

Makale

ASP.NET 2.0 ile birlikte gelen site navigasyonu yapısı ve kontrolleri ziyaretçilerin site içerisinde kolay şekilde gezinmelerini sağlayacak menüler oluşturabilmemizi sağlamaktadır. Projelerimizde pratik şekilde kullanabileceğimiz bu yapılar birçok ihtiyacımızı karşılayacak özelliklere sahiptir. Fakat bazen kendi özel durumlarımıza göre bu kontrolleri değiştirmek veya varolan yapıya ek nitelikler kazandırmak isteyebiliriz. Aslında site navigasyonu hakkında birçoğumuzun bilmediği özellikler belki de bizim projelerdeki bu tip ihtiyaçlarımızı karşılayabilecektir. İşte bu makalede ASP.NET'te site navigasyonu hakkında bilinmeyen yönleri keşfetmeye çalışacağız. Aşağıda beş başlıkta bu konuların detaylarını inceleyoruz.


Site Haritasının Belirli Kısımlarını Görüntüleme

Site navigasyonu işlemlerinde kullandığımız sitemap dosyasının belirli standartları bulunmaktadır. En dışta sadece bir SiteMapNode düğümünün olması, aynı linki birden fazla kez kullanamamak (bu kısıtlamayı nasıl aşabileceğimizi bir sonraki başlıkta göreceğiz) gibi standartlar bazen karşımıza birer kısıtlama olarak çıkmakta ve yapmak istediğimiz işlemleri engelleyebilmektedir. Yine bazı durumlarda içerisinde onlarca düğüm (node) bulunduran bir site haritasının sadece belirli bir kısmını görüntülemek isteyebiliriz. SiteMapDataSource kontrolünün bazı özelliklerini kullanarak site haritasının belirli kısımlarının görüntülenmemesi veya sadece belirli kısımlarından sonraki düğümlerin görüntülenmesi gerçekleştirilebilir. Dilerseniz standart bir sitemap dosyası hazırlayarak ne gibi işlemleri yapabileceğimizi inceleyelim.

Web.sitemap

<?xml version="1.0" encoding="windows-1254" ?>

<siteMap>
  <siteMapNode url="Default.aspx" title="Anasayfa">
    <siteMapNode url="Makale.aspx" title="Makaleler">
        <siteMapNode url="Aspnet.aspx" title="ASP.NET" description="ASP.NET konusunda makaleler" />
        <siteMapNode url="Adonet.aspx" title="ADO.NET" description="ADO.NET konusunda makaleler" />
        <siteMapNode url="Cs.aspx" title="C#" description="C# konusunda makaleler" />
        <siteMapNode url="SqlServer.aspx" title="SQL Server" description="SQL Server ile ilgili makaleler" />
    </siteMapNode>
    <siteMapNode url="Videolar.aspx" title="Videolar" description="Teknik içerikli videolar">
        <siteMapNode url="KonuAnlatimi.aspx" title="Konu Anlatımı" description=".NET içerikli görsel videolar" />
        <siteMapNode url="Webiner.aspx" title="Webiner" description="Web seminerlerinin videoları" />
    </siteMapNode>
    <siteMapNode url="Forum.aspx" title="Forum" />
    <siteMapNode url="Iletisim.aspx" title="İletişim" />
  </siteMapNode>
</siteMap>

Sitenin genelinde şablon olarak kullanılacak olan bir master sayfaya SiteMapPath, TreeView ve SiteMapDataSource kontrollerini ekleyerek sitemap dosyasından getirilen verileri sayfamıza yükleyelim. Sayfayı çalıştırıp sonucunu görerek neler yapabileceğimiz üzerinde yazımıza devam edelim. Aşağıda sayfamızın kodları ve çıktısı bulunmaktadır.

Sablon.master

<form id="form1" method="post" runat="server">
  <asp:SiteMapPath ID="SiteMapPath1" runat="server" /><br><br>
  <asp:TreeView ID="TreeView1" runat="server" DataSourceID="SiteMapDataSource1" />
  <asp:SiteMapDataSource ID="SiteMapDataSource1" runat="server" />

</form>


Resim: Sitemap dosyasındaki veriler SiteMapPath ve TreeView kontrolüne eklendi

web.sitemap dosyasında oluşturulan site haritasında hiyerarşik olarak en üstte Anasayfa bulunmaktadır. Bu link sayfamızda da aynı şekilde tutuluyor. Fakat TreeView kontrolünde anasayfa linkinin görülmesi çoğu zaman istenilmeyen bir durumdur. Özellikle SiteMapPath ile birlikte TreeView kullanıldığında zaten Anasayfa linki sürekli olarak SiteMapPath'de yer alacağı için TreeView'da en dışta tüm node'ları kapsayan Anasayfa node'unu göstermek istemeyebiliriz. Fakat sitemap dosyasında da en dışta bir SiteMapNode bulundurmak gibi bir zorunluluğumuz olduğunu da belirtmiştik; yani web.sitemap'te bu linki bulundurmak zorunludur. Peki TreeView'dan bu linki nasıl kaldırabiliriz?

SiteMapDataSource kontrolüne ait ShowStartingNode özelliği (property) bu işlemi gerçekleştirmemizi sağlar. bool tipinden değer alan bu özellik varsayılan olarak true değerini taşır ve başlangıç node'unun gösterilmesini sağlar. Eğer bu özelliğe false değeri atanırsa sitemap dosyasını veri kaynağı olarak kullanan kontrolde en dıştaki node okunmaz. Aşağıda değişen kod kısmı ve sayfanın yeni çıktısı görülmektedir.

Sablon.master

...
<asp:SiteMapDataSource ID="SiteMapDataSource1" runat="server" ShowStartingNode="false" />
...


Resim: ShowStartingNode özelliği false değeri olarak ayarlandığında en dıştaki node listelenmez

Bu şekilde en dıştaki node'un görüntülenmesi engellendi ve artık Anasayfa linki görüntülenmiyor. SiteMapPath kontrolü SiteMapDataSource kontrolüne bağımlı çalışmadığı için bu değişiklikten etkilenmez ve Anasayfa linkini görüntüler.

Bazı durumlarda da site haritasındaki içeriklerin belirli kısmını görüntülemek isteyebiliriz. Örneğin yukarı kullandığımız senaryoda ziyaretçi Makaleler kategorisi içerisinde gezerse TreeView'da sadece Makaleler kategorisinin alt linklerini görüntülemek isteyebiliriz. Sitemap içeriğinin sadece belirli bir kısmını görüntülemek istediğimiz durumlarda kullanabileceğmiz birden fazla özellik bulunmaktadır. Aşağıda bu özellikler ve açıklamaları bulunmaktadır.

- StartFromCurrentNode: O an bulunulan sayfanın node ve alt node'larının getirilmesini sağlar. bool tipinde değer alır ve true değeri aldığında sadece bulunulan sayfanın node ve alt node'larını getirir. Özellikle karmaşık site haritalarında ziyaretçiye sadece o an ziyaret ettiği kategorinin alt kategorilerini görüntülemek istendiğinde kullanılabilir. Örneğin kullanıcı Makale.aspx sayfasında bulunduğunda TreeView veya Menu kontrolü sadece Makaleler kategorisindeki linkleri görüntüler.

- StartingNodeUrl: Belirtilen adresin bulunduğu node'u ve alt node'larını getirir. Değer olarak string tipinden sayfanın adurl bilgisini almaktadır. Belirli sayfalarda sadece belirli bir kategorinin ve alt kategorilerinin görüntülenmesi istenildiğinde kullanılabilir. Örneğin sitede editör olan bir kişi siteye giriş yaptığında menü kısmında sadece Editorler.aspx sayfası ve bu sayfanın altında kalan sayfaların görüntülenmesi istenildiğinde bu özellik "Editorler.aspx" değerine ayarlanabilir.

Aşağıdaki kod örneklerinde yukarıda bahsedilen özelliklerin kullanımı görülmektedir. Kodların hemen altında ise sayfanın çıktısı bulunmaktadır.

Sablon.master (StartFromCurrentNode kullanımı)

<asp:SiteMapDataSource ID="SiteMapDataSource1" runat="server" StartFromCurrentNode="true" />


Resim: StartFromCurrentNode true değeri aldığı için o an bulunulan kategori ve alt kategorileri getirildi


Sablon.master (StartingNodeUrl kullanımı)
<asp:SiteMapDataSource ID="SiteMapDataSource1" runat="server" StartingNodeUrl="Videolar.aspx" />


Resim: StartingNodeUrl özelliği Videolar.aspx değerini aldığı için sitemap dosyasında bu sayfa ve altında yer alan node'lar getirildi


Site Haritasında Aynı Linki Birden Fazla Kullanmak

Sitemap dosyasındaki siteMapNode'ların url bilgilerinin tekil (unique) değerler olması gerekmektedir. Site haritası oluşturulurken XmlSiteMapProvider tarafından url bilgileri tekil değer olarak alınır ve birbirini tekrar eden url bilgilerinin olmasına izin verilmez. Önceki örnekte kullandığımız web.sitemap dosyasındaki Makale.aspx url bilgisini Default.aspx bilgisi ile değiştirelim. Sayfayı çalıştırdığımızda aşağıdaki gibi bir hata sayfası ile karşılaşırız.

Web.sitemap

<siteMap>
  <siteMapNode url="Default.aspx" title="Anasayfa">
    <siteMapNode url="Default.aspx" title="Makaleler">
    ...


Resim: Sitemap dosyasında aynı URL bilgisini taşıyan iki node bulunduğu için hata oluştu

Görüldüğü gibi web.sitemap dosyasında birden fazla URL kullanımına izin verilmez. Fakat bazı durumlarda site haritasında aynı linki birden kez fazla kullanma ihtiyacı hissedebiliriz. Böyle bir durumda maalesef aynı linkleri kullanma şansımız olmayacaktır. Ancak kendi özel SiteMapProvider'larımızı oluşturarak bu tip bir işlemi gerçekleştirebiliriz. Peki varolan yapıyı kullanarak bu işlemi nasıl gerçekleştirebiliriz? Bu işlem için iki yol seçilebilir. Bunlardan ilki URL ReWriting ile farklı url'leri aynı sayfaya yönlendirme yapmak olabilir, fakat bu pek etkili bir yöntem olmayacaktır. Zira aynı linki 3-4 yerde kullanmak için farklı URL ReWriting tanımlamaları yapmak gerekebilir. Bir diğer yol ise asıl sayfa adresinin sonuna geçersiz QueryString'ler yazmak olacaktır. Her ne kadar etkili ve tavsiye edilecek bir yol olmasa da böyle bir durumda kullanılabilecek en kolay çözüm bu olacaktır. Örneğin aynı sayfayı üç farklı yerde kullanmak istersek Sayfa.aspx, Sayfa.aspx?1 ve Sayfa.aspx?2 gibi üç farklı url kullanıp aynı sayfaya link verebiliriz. Aşağıda web.sitemap dosyasındaki url'lerin değiştirildiği ve sayfanın düzgün şekilde çalıştığı görülebilir.

Web.sitemap
<siteMap>
  <siteMapNode url="Default.aspx" title="Anasayfa">
    <siteMapNode url="Default.aspx?1" title="Makaleler">
    ...


Resim: Sitemap dosyasında aynı olan URL bilgilerinin sonuna geçersiz QueryString'ler eklendiğinde farklı anahtar değerleri taşındığı için aynı sayfalar link verilebilir


SiteMap Nesnesi ile Çalışmak

Sitemap dosyalarında taşınan bilgileri uygulama içerisinden okuma olanağımız bulunmaktadır. Sonuçta XML olarak taşınan bu verileri programatik yollarla elde etme şansımız olacaktır. .NET Framework gibi güçlü bir altyapıya sahip ortamda bu dosyayı XML olarak okuma işlemi yapmak yerine elbetteki daha kolay bir yolumuz da olacaktır! SiteMap adındaki nesne ile bu dosya içerisindeki belirli bilgileri kolay ve etkili şekilde okuyabilmekteyiz. Özellikle o an bulunduğumuz sayfa ile ilgili bilgileri site haritası dosyasından okuyabilmek bizim için önemli olacaktır. SiteMap.CurrentNode özelliği o an bulunulan sayfanın siteMapNode düğümünün SiteMapNode sınıfı tipinden değerini getirecektir. Bu özellik üzerinden erişebileceğimiz önemli bilgileri aşağıda listesini gördüğünüz özelliklerden (property) elde edebiliriz.

Description: Bulunulan sayfanın description kısmındaki bilgi
Title: Bulunulan sayfanın title kısmındaki bilgi
Url: Bulunulan sayfanın url kısmındaki bilgisi
HasChildNodes: Bulunulan sayfa node'unun altında alt node (child node) olup olmadığı bilgisi. bool değer getirir ve true alt node'ların olduğunu belirtir
ChildNodes: Eğer alt node'lara sahip ise bu node'ların SiteMapNodeCollection tipinden listesinin getirir
ParentNode: Bulunulan sayfa node'unun üst kısmında yer alan sayfa node'unun SiteMapNode tipinden değerini getirir
NextSibling: Aynı seviyede bir sonraki kısımda bulunulan sayfa node'unun SiteMapNode tipinden değerini getirir
PreviousSibling: Aynı seviyede bir önceki kısımda bulunulan sayfa node'unun SiteMapNode tipinden değerini getirir

SiteMap nesnesini kullanabilmek için sayfamızda SiteMapDataSource veya diğer site navigasyonu kontrollerinin bulunması zorunlu değildir. Eğer o an görüntülenen sayfa projemizdeki web.sitemap dosyasında bulunuyor ise SiteMap.CurrentNode özelliği bize o sayfanın SiteMapNode tipinden değerini otomatik olarak getirecektir.

Özellikle sitemap dosyasındaki title ve description nitelikleri sayfamızda sıklıkla kullanabileceğimiz özellikler olabilir. Örneğin ADO.NET kategorisindeyken sayfamızın başlık bilgisini title kısmından alıp ADO.NET olarak belirlemek ve sayfanın belirli bir kısmındaki bir etikete de description kısmından alınan bilgiyi yazdırmak kulağa oldukça hoş gelen kolaylıklar gibi geliyor. Aşağıda bu özelliklerin bazılarını kullanarak sayfamızda değişiklikler yapıyoruz.
Sablon.master

...
<br><asp:Label ID="lblSayfaBilgi" runat="server" ForeColor="Red"/>
<br><asp:HyperLink ID="hlOnceki" runat="server" ForeColor="Blue"/>
<asp:HyperLink ID="hlSonraki" runat="server" ForeColor="Blue"/>
...

Sablon.master.cs
protected void Page_Load(object sender, EventArgs e)
{
    this.Title = SiteMap.CurrentNode.Title;

    if(!String.IsNullOrEmpty(SiteMap.CurrentNode.Description))
       lblSayfaBilgi.Text = "<br>Bu sayfada " + SiteMap.CurrentNode.Description + " bulabilirsiniz.";


    if(SiteMap.CurrentNode.PreviousSibling != null)
    {
       hlOnceki.Text = SiteMap.CurrentNode.PreviousSibling.Title + " <<";
       hlOnceki.NavigateUrl = SiteMap.CurrentNode.PreviousSibling.Url;
    }
    if(SiteMap.CurrentNode.NextSibling != null)
    {
       hlSonraki.Text = ">> " + SiteMap.CurrentNode.NextSibling.Title;
       hlSonraki.NavigateUrl = SiteMap.CurrentNode.NextSibling.Url;
    }
}


SiteMap.CurrentNode özelliği kullanılarak sayfa hakkındaki bilgileri elde ettik


Site Haritasına Ek Bilgiler Ekleme

Sitemap dosyasında saklanan standart sayfa bilgileri url, title ve description niteliklerinde tutulmaktadır. Bu niteliklerde sayfa ile ilgili istenilen en temel bilgiler saklamaktadır. Fakat bazı durumlarda site haritası dosyasında bir sayfa ile ilgili farklı bilgileri de saklamak isteyebiliriz. Bu tip bilgileri elbetteki farklı veri kaynaklarından (XML dosyası, veritabanı gibi) elde ederek kullanıcılara sunabiliriz. Fakat bir sayfanın bazı bilgilerini sitemap dosyasından, bazı bilgilerini de farklı bir kaynaktan elde etmek kötü bir pratik olacaktır. Peki sayfa ile ilgili saklamak istediğimiz bu tip bilgileri yine sitemap dosyası içerisinde saklamamız mümkün müdür? Sitemap dosyasının yapısı buna uygun mudur ve saklanan bilgileri sayfa içerisinden elde etmek için ekstra işlemler yapmak gerekir mi?

Sitemap dosyaları içerisinde ek bilgileri kolay şekilde taşıyabilmektedir. Böyle bir durumda uygulama içerisinden bu bilgilere ulaşmak ise beklediğimizden daha kolay olacaktır. Ek bilgileri saklamak için daha önceden bir yerlerde (SiteMap sağlayıcısı gibi) tanımlama yapmaya gerek yoktur. Nasıl ki bir sayfanın url bilgisini siteMapNode içerisinde tanımlayabiliyorsak, bu bilgileri de aynı şekilde tanımlayabiliriz. Sayfa içerisinden okuma işlemini ise biraz farklı bir yoldan ama oldukça basit bir şekilde gerçekleştirilebilir. Dilerseniz daha önceki örneklerde kullandığımız sitemap dosyamız üzerinde bir örnek yaparak bu işlemleri nasıl gerçekleştirebileceğimizi görelim. Sitemizdeki kategorilerin her birisinde bulunacak editör bilgilerini sitemap dosyasında ilgili sayfanın node'unda saklayıp, ziyaretçi bir kategoriyi gezdiğinde ilgili kategorinin editörünü sayfada görüntüleyeceğiz. Öncelikli olarak sitemap dosyasındaki her bir kategori node'una Editor adında bir nitelik tanımlıyor ve ilgili editörlerin isimlerini belirtiyoruz. Aşağıda web.sitemap dosyamızın bir kısmında yapılan değişiklikler görülmektedir.

Web.sitemap

...
    <siteMapNode url="Makale.aspx" title="Makaleler">
        <siteMapNode url="Aspnet.aspx" title="ASP.NET" description="ASP.NET konusunda makaleler" Editor="Uğur UMUTLUOĞLU" />
        <siteMapNode url="Adonet.aspx" title="ADO.NET" description="ADO.NET konusunda makaleler" Editor="Burak BATUR" />
        <siteMapNode url="Cs.aspx" title="C#" description="C# konusunda makaleler" Editor="Emrah USLU" />
        <siteMapNode url="SqlServer.aspx" title="SQL Server" description="SQL Server ile ilgili makaleler" Editor="Bülent SÖZGE" />
    </siteMapNode>
...

Her bir node içerisinde Editor="Uğur UMUTLUOĞLU" şeklinde nitelik tanımlamaları yapmak yeterli olacaktır. Gelelim sayfa içerisinden bu bilgiyi nasıl elde edebileceğimize. Makalemizin önceki kısımlarında bulunduğumuz sayfanın varolan bilgilerini Sitemap nesnesinin CurrentNode özelliği üzerinden okuyabildiğimizi görmüştük. Örneğin title bilgisini SiteMap.CurrentNode.Title ifadesi ile elde edebilmiştik. Title ve diğer özellikler SiteMapNode sınıfı içerisinde daha önceden tanımlı oldukları için sınıfın nesne örneği üzerinden erişebiliriz. Fakat sonradan tanımladığımız Editor bilgisini özellik (property) üzerinden değil de CurrentNode özelliğinin indeksleyicisi (indexer) üzerinden erişebiliriz. Aşağıdaki tek satırlık ifade bu bilgiyi sayfamıza eklediğimiz lblEditor adındaki bir etikete aktarmamızı sağlayacaktır.

Sablon.master.cs

protected void Page_Load(object sender, EventArgs e)
{
    ...
    lblEditor.Text = "Bölüm Editörü: " + SiteMap.CurrentNode["Editor"];
    ...
}

Sayfayı çalıştırdığımızda o an bulunduğumuz kategorinin siteMapNode düğümünden okunan Editor bilgisinin elde edildiğini görebiliriz. SiteMap.CurrentNode özelliği o anki sayfanın siteMapNode düğümünün nesne örneğini getirmekte ve içerisinde taşınan Editor bilgisini de indeksleyici üzerinden SiteMap.CurrentNode["Editor"] şeklinde okuyabilmekteyiz. Bu şekilde sitemap dosyasında farklı nitelikler tanımlayıp sayfa içerisinden kolay şekilde okunmasını sağlayabiliriz. Aşağıda sayfamızın çıktısı görülmektedir.


Resim: web.sitemap dosyasından okunan Editor bilgisi sayfada görülmektedir


Birden Fazla Sitemap Dosyası Kullanabilmek

ASP.NET uygulamalarında bazı durumlarda birden fazla site haritası dosyası kullanmak isteyebiliriz. Farklı içerikleri olan linkleri ayrı iki dosyada toplayarak sayfamızın farklı kısımlarında görüntülemek kullanıcıların site içerisinde gezinmelerini kolaylaştıracaktır. Fakat site navigasyon kontrollerini SiteMapDataSource kontrolü ile beslediğimizde sadece bir tane sitemap dosyası kullanabilmekteyiz. Bu durumun sebebi ise site haritası sağlayıcılarında (SiteMap Provider) sadece web.sitemap dosyası için bir tanımlama yapılmasıdır. Web uygulamalarında kullandığımız web.config dosyaları bildiğimiz gibi .NET Framework'ün kurulu olduğu dizinde bulunan bazı konfigürasyon dosyalarından kalıtım yoluyla elde edilerek kullanılır. Yani bir sunucuda çalışan tüm web uygulamaları bu dizindeki .config dosyalarında yapılan ayarlara göre çalışmaktadır. Windows XP işletim sistemi ile .NET Framework 2.0 kurulu olan bir bilgisayarda C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\CONFIG dizininde bulunan web.config dosyasına bakılacak olunursa <siteMap> düğümünde sadece bir sağlayıcı tanımlaması olduğu görülür. Yine bu tanımlamada göreceğimiz siteMapFile niteliği aslında SiteMapDataSource kontrolünün verileri hangi dosyadan okuduğunun göstergesidir. Aslında buradaki tanımlamalardan yola çıkarak uygulamadaki web.config dosyasına birden fazla sağlayıcı tanımlaması yapıp farklı isimdeki .sitemap dosyalarının projemizde kullanılabilmesini sağlayabiliriz. Öncelikli olarak web.config dosyamıza web2.sitemap isimli bir dosyayı da kullanabilmemizi sağlayan tanımlamayı ekleyelim. <system.web> düğümü içerisine açacağımız <siteMap> düğümüne ekleyeceğimiz kodlar aşağıda görülmektedir.

web.config

<system.web>
...
<siteMap>
   <providers>
      <add name="SiteMapProvider2" siteMapFile="web2.sitemap" type="System.Web.XmlSiteMapProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"/>
   </providers>
</siteMap>
</system.web>

Bu şekilde artık uygulamamızda web.sitemap dosyası dışında web2.sitemap dosyasını da kullanabiliriz. Öncelikli olarak projemize web2.sitemap adında bir site haritası dosyası ekleyelim. Ardından da sayfamıza bir Menu kontrolü ile bir SiteMapDataSource kontrolü ekleyelim. SiteMapDataSource kontrolünün SiteMapProvider özelliği az önce web.config dosyasına eklediğimiz SiteMapProvider2 sağlayıcısı olarak belirlenirse Menu kontrolüne web2.sitemap dosyasındaki veriler aktarılacaktır. Aşağıda web2.sitemap ve Sablon.master dosyalarına eklenen kodlar görülmektedir.

web.sitemap

<?xml version="1.0" encoding="windows-1254" ?>
<siteMap>
   <siteMapNode url="Default.aspx" title="Anasayfa">
     <siteMapNode url="" title="Üyelik İşlemleri">
        <siteMapNode url="SifreDegistir.aspx" title="Şifre Değiştir" description="" />
        <siteMapNode url="Profil.aspx" title="Profil Bilgileri" description="" />
     </siteMapNode>
     <siteMapNode url="Haberler.aspx" title="Haberler" description="">
        <siteMapNode url="YazilimHaberleri.aspx" title="Yazılım Dünyasından Haberler" description="" />
        <siteMapNode url="SeminerHaberleri.aspx" title="Seminer Haberleri" description="" />
        <siteMapNode url="Duyurular.aspx" title="Duyurular" description="" />
     </siteMapNode>
     <siteMapNode url="KitapOneri.aspx" title="Kitap Önerileri" />
   </siteMapNode>
</siteMap>

Sablon.master
...
<asp:Menu ID="Menu1" runat="server" DataSourceID="SiteMapDataSource2" Font-Names="Verdana" Font-Size="12px"></asp:Menu>
<asp:SiteMapDataSource ID="SiteMapDataSource2" runat="server" ShowStartingNode="False" SiteMapProvider="SiteMapProvider2" />
...

Sayfayı çalıştırdığımızda daha önceden hazırladığımız TreeView kontrolünün SiteMapDataSource1 kontrolü ile web.sitemap dosyasından, Menu kontrolünün ise SiteMapDataSource2 kontrolü ile web2.sitemap dosyasından getirilen verilerle doldurulduğunu görebiliriz. Aşağıda sayfamızın çıktısı bulunmaktadır.


Resim: Birden fazla sitemap dosyasından alınan veriler TreeView ve Menu kontrollerine yüklendi

Bu makalemizde site navigasyon işlemlerinin bilinmeyen yönlerini incelemeye çalıştık. ASP.NET 2.0 ile birlikte gelen sitemap dosyaları ve site navigasyon kontrolleri birçok işlemin kolay şekilde yapılmasını sağlamaktadır. Bu yapıları detaylı şekilde bilmemiz durumunda karşımıza çıkabilecek farklı senaryoları kolay şekilde çözebiliriz. Başka bir makalede görüşmek dileğiyle.

Uğur UMUTLUOĞLU
www.nedirtv.com
www.umutluoglu.com