24 Nisan 2012 Salı

SiteMapDataSource ile Menü Tasarımı

   Menü tasarlamanın pek çok farklı yolu vardır. Bunlardan birisi de SiteMapDataSource kullanmak. Öncelikle sayfamıza 1 Menu bir de SiteMapDataSource kontrolü yerleştirelim. Ardından Menu Tasks bölümünden Choose Data Source alanından ilgili SiteMapDataSource kontrolümüzü seçelim. Projemize Add - New Item diyerek yeni bir sitemap dosyası ekleyelim. Dosyanın içeriğini istediğiniz şekilde şekillendirin. Örneğin :


<?xml version="1.0" encoding="utf-8" ?>
<siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0" >


<siteMapNode url="default.aspx" title="Anasayfa"  description="Burası ana sayfa">
        <siteMapNode url="Hakkimizda.aspx" title="Hakkımızda"  description="Bu sayfa site sahibi hakkında bilgi veriyor." />    
        <siteMapNode url="Uyelik.aspx" title="Üye Ol"  description="Üye Ol" />
        <siteMapNode url="Yardim.aspx" title="Yardım"/>
        <siteMapNode url="Iletisim.aspx" title="İletişim" />      
 <siteMapNode  title="Üye" description="Üyelerin alanı" roles="Uye">
            <siteMapNode url="~/Uye/Profilim.aspx" title="Profilim"/>
        </siteMapNode>

</siteMapNode>

Sitemap dosyanız yukarıdakine benzer bir tasarıma sahip olmalı. Şimdi gelelim web.config ayarına:

 <system.web>
      <siteMap>
          <providers>
              <add name="SiteMapDataSourceDefault" siteMapFile="Default.sitemap"
                    type="System.Web.XmlSiteMapProvider, System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" securityTrimmingEnabled="true"/>              
          </providers>
       </siteMap>
 </system.web>


   SiteMapDataSource kontrolünüzün SiteMapProvider özelliğine SiteMapDataSourceDefault adını verdim. Siz farklı bir isim verebilirsiniz. siteMapFile kısmında yukarıda da gördüğünüz gibi sitemap dosyamızın adını veriyoruz.

   Bir menü tasarlarken kullanıcılarımız bazı sayfalara bu menü aracılığıyla erişebilmelerini engellemek isteyebilir. Örneğin bir yönetici rolüne sahip kullanıcının hemen hemen bütün sayfalara erişebilmesini isteriz. Bazı kullanıcıların da bazı sayfalara erişmesini bazılara ise erişmemesini isteyebiliriz. Bunu yapmanın yolu roles özelliğinden geliyor. Yukarıda roles="Uye" diyerek üye rolüne sahip kullanıcıların bazı sayfaları görmelerini sağladık. Üye rolüne sahip olmayanlar bu sayfaları göremeyecek. 

   Burada dikkat edilmesi gereken bir konu var. O da <siteMapNode  title="Üye" description="Üyelerin alanı" roles="Uye"> alanında url kısmının olmaması gerekiyor. Eğer url kısmı eklerseniz menüde gözükecektir ve roles özelliğini kullanmanın hiçbir anlamı kalmayacaktır. Burada rolden kastedilen aspnet_Roles tablomuzda veya "Web Site Administration Tool" aracında gördüğümüz rollerdir. Dikkat edilmesi gerek bir diğer konu da web.config ayarlarında securityTrimmingEnabled="true" özelliğinin true yapılmış olması gerekiyor. Aksi taktirde hata mesajı ile karşılaşabilirsiniz.