Kurumsal Otomasyon Çözümlerinde Zirve

Sql ile SiteMapProvider

SQLSiteMapProvider

ASP.NET uygulamalarında sıkça kullandığımız TreeView, Menu vb. bazı kontroller kaynak olarak SiteMapDataSource yada XmlDataSource kullanılar. Fakat bu veri kaynakları üzerinde silme,ekleme ve güncelleme işlemleri yapmak SQL tablolarıyla çalışmak kadar kolay değildir. Bu makaledeki amacımız sayfanızdaki Menu yada TreeView kontrolunun veri kaynağını SQL (“farklı veritabanıda olabilir”) serverdaki bi tablo ile ilişkilendirmek. Bunun için tek yapmamız gereken SiteMapProvider class’ından kalıtım alarak yeni bir Provider yazmak ve gerekli ayarları web.config ‘den yapmak.
Öncellikle uygulamamızda kullanacağımız Menu ve icerik tablolarını SQL’ de oluşturalım. Aşağıdaki Sql Script’ini kullanabilirsiniz.

İcerik Tablosu:

CREATE TABLE [dbo].[icerik](
[id] [numeric](18, 0) IDENTITY(1,1) NOT NULL,
[ad] [varchar](50) COLLATE Turkish_CI_AS NULL,
[detay] [nvarchar](max) COLLATE Turkish_CI_AS NULL,
CONSTRAINT [PK_icerik] PRIMARY KEY CLUSTERED
(
[id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

Menu Tablosu

CREATE TABLE [dbo].[menu](
[id] [numeric](18, 0) IDENTITY(1,1) NOT NULL,
[ad] [varchar](100) COLLATE Turkish_CI_AS NULL,
[icerikid] [numeric](18, 0) NULL,
[ust] [numeric](18, 0) NULL,
[sira] [numeric](3, 0) NULL,
CONSTRAINT [PK_menu] PRIMARY KEY CLUSTERED
(
[id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

Şimdi Tablolarımıza veri girelim
Menu Tablosu için;

 

 

İcerik Tablosu için:

sql-ile-sitemapprovider-2

sql-ile-sitemapprovider-2

Tablolarımızı inceliyecek olursak Menu tablosunda her menu için bir ust menu girilmiş.Örneğin Visual Basic.NET e bakarsınız ust bilgisi olarak 5 girilmiş. Bunun anlamı Visual Basic.NET menusu id numarası 5 olan menu altında demektir. Ust menusu olmayan menulere ise ust degeri olarak 0 değerini verdim. Böylece hangi menu hangi menunun altında bunu belirlemiş olduk ve bu yapı sayesinden bir menu içerisine istenildiği kadar menu eklenebilir. Ayrıca icerikid değeri ilede menuye tıklandığında hangi içeriğin görüntüleneceğini de belirtmiş olduk.

Şimdi ise Sql için Kendi Providerımızı yazalım.
Projemize yeni bir class ekleyelim ve ismine “SNNSiteMapProvider” yazalım.
Ve bu Class’a SiteMapProvider class’ından kalıtım verelim ve SiteMapProvider üzerinde sağ click yaparak Implement Abstract Class diyelim.
Kalıtım aldığımız class bir Abstract yani soyut sınıf olduğu için bu class içerisinde abstract olarak tanımlı methodları kendi class’ımızda tekrar kodlamamız gerekli.(override)

sql-ile-sitemapprovider-3

sql-ile-sitemapprovider-3

Bu class için yazmamız gerekod aşağıdaki gibi olmalıdır.
public class SNNSiteMapProvider:SiteMapProvider
{
SqlConnection baglanti;
SqlCommand cmd;
public SNNSiteMapProvider()
{
baglanti = new SqlConnection(“server=localhost;initial catalog=zirvedekibeyinler;integrated security=true”);
}
private void BaglantiKontrol()
{
if (baglanti.State == ConnectionState.Closed)
baglanti.Open();
}
public override SiteMapNode FindSiteMapNode(string rawUrl)
{
SiteMapNode eleman = new SiteMapNode(this, “0”);
return eleman;
}

public override SiteMapNodeCollection GetChildNodes(SiteMapNode node)
{
string ust;
ust = node.Key;
cmd = new SqlCommand(“select id,ad,icerikid from menu where ust=@ust order by sira”, baglanti);
cmd.Parameters.Add(“@ust”, SqlDbType.Int).Value = ust;
BaglantiKontrol();
SqlDataReader oku = cmd.ExecuteReader();
SiteMapNodeCollection liste = new SiteMapNodeCollection();
SiteMapNode eleman;
while (oku.Read())
{
eleman = new SiteMapNode(this, oku[0].ToString(), “~/detay.aspx?DetayId=” + oku[2].ToString(), oku[1].ToString());
liste.Add(eleman);
}
oku.Close();
baglanti.Close();
return liste;

}

public override SiteMapNode GetParentNode(SiteMapNode node)
{

SiteMapNode eleman = new SiteMapNode(this, “0”);
return eleman;
}

protected override SiteMapNode GetRootNodeCore()
{
SiteMapNode eleman = new SiteMapNode(this, “0”);
return eleman;
}
}

Burada dikkat ederseniz bizim için en önemli method GetChildNodes methodudur. SiteMapNode elemanının url,key ve title özelliklerini kullandık. Key özelleğinde menunun id’sini Title da menu adını url de ise icerikid kolonun dan gelen değere göre yönlendirme yaptık. GetChildNodes Methodunda ise kendisine parametre olarak gelen SiteMapNode için alt menuleri bulduk ve bunları SiteMapNodeCollection nesne si olarak geri döndürdük. Diğer methodlarda ise sadece en üst menunun id sini döndürdük.
Hatırlayın menu tablosuna kayıt girerlek hiç bir menunu altında olmayan menulerin ust değerini 0 girmiştik.

SiteMapProvider’ımız hazır şimdi ise tek yapmamız gerek Web.config’te gerekli ayarları yapmak.

<siteMapdefaultProvider=”SNNSiteMapProvider”>

<addname=”SNNSiteMapProvider”type=”SNNSiteMapProvider”/>
providers>
siteMap>

Sitemap tagını System.Web tagı altında yukarıdaki şekilde yazmanız yeterli.

Bakalım SiteMapProvider ımız nasıl çalışcak.
Öncelikle Default.aspx üzerine Menu kontrolu ekleyin ve ardından SiteMapDataSource sürükleyip bırakın. Menu kontrolu için DataSource özelliğine az önce eklediğimiz SiteMapDataSource’u seçin. Dilerseniz Menu’nun özelliklerinden Orientation özelliğiniz Horizontal yaptın.
SiteMapDataSource için se SiteMapProvider özelliğine SNNSiteMapProvider yazalım ve ShowStartingNode özelliğini False yapalım.

Uygulamamızı çalıştıralım ve Sonucu görelim.

sql-ile-sitemapprovider-3-1

sql-ile-sitemapprovider-3-1

Az önce Eklediğimiz SiteMapDataSource’u TreeView için Kullanalım.
Aşağıdaki ayarları uygulayın.

sql-ile-sitemapprovider-4

sql-ile-sitemapprovider-4

sql-ile-sitemapprovider-5

sql-ile-sitemapprovider-5

Ve uygulamınızı tekrar çalıştırdığınızda sonuç aşağıdaki gibi olmalıdır.

sql-ile-sitemapprovider-6

sql-ile-sitemapprovider-6

SiteMapProvider yazarken Url özelliğinde Detay.aspx?DetayID= diyerek Detay sayfasına yönlendirme yapmıştık. Projenizine Detay.aspx sayfası ekleyip QueryString deki DetayId değerini okuyuk icerik tablosundaki içeriğini kolaylıkla yazdırabilirsiniz.

Bu aşamadan sonra Menu yada TreeView’e eleman eklemek,silmek ve güncelleme çok kolay olacaktır. Bu kontrolleri artık SQL serverdaki tablolarınızdan yönetebilirsiniz.

Yorum Yapılmamış

Bir cevap yazın