Asp.Net'te Sınırsız Menü Ve Alt Menü Örneği 1
-
Bu makalemizde ASP.Net ile sınırsız kategori ve alt kategori mantığıyla yapılmış bir örneğimizi sizlere aktarmaya çalışacağız.
Asp.Net ile yaptığınız projelerde bazen kategori, alt kategori veya menü, alt menü ihtiyacı doğar. Bu makalemizde bu hiyerarşinin sınırsız döngüye sahip olanı anlatılcaktır. Makalede, kategori ve alt kategori sistemi üzerine örnek yapacağız.
Öncelikle veritabanı tasarımını yapalım. Anlatımlar, access veritabanı üzerinde yapılacaktır.
Veritabanı SorgusuCREATE Table tblKategoriler ( kategori_ID AutoIncrement, ust_kategori_ID NUMERIC, kategori TEXT(50) )
Veritabanımız oluştu. Burada ust_kategori_ID adlı sütunun varsayılan değerinini "0" olarak belirtmemiz gerekir. Çünkü hangi sütunun ana kategori olarak bilinmesindeki bir belirteç olacaktır. Veritabanımızdaki tblKategoriler adlı tabloyu düzenleyip ilgili sütunun varsayılan değerini 0 (sıfır) olarak belirtiyoruz.
Kategoriler
Veritabanımız ile ilgili ayarlamaları yaptık. Şimdi ise ilk olarak ana kategorileri ekleyelim.
Ana kategorilerimiz şunlar olsun: Bilgisayar, Televizyon, Giyim
Alt Kategoriler
Ana kategorilerin (yani en üst kategorilerin) ust_kategori_ID değeri "0" olacak şekilde çalışmamızı ayarladık.Ana kategorilere ait alt kategorileri de girelim.
Bilgisayar kategorisine ait alt kategoriler: Laptop, Masaüstü, Netbook (ust_kategori_ID = 1)
Televizyon kategorisine ait alt kategoriler: LCD, LED, OLED (ust_kategori_ID = 2)
Giyim kategorisine ait alt kategoriler: Erkek, Kadın, Çocuk, Bebek (ust_kategori_ID = 3)Alt Kategoriler

2. aşamada alt kategorilerimizi de ekledik.
Eklemiş olduğumuz alt kategorilere ait birkaç alt kategori ekleyelim.
Laptop kategorisine ait alt kategoriler: ASUS, SONY, MSI, MONSTER, APPLE (ust_kategori_ID = 4)
Erkek giyim kategorisine ait alt kategoriler: Takım Elbise, Eşofman
Televizyon kategorisine ait alt kategori: SHARP
Alt Kategoriler
Görüldüğü gibi, basit hiyerarşide birbirini izleyen alt ve üst kategori mantığına göre veritabanımızı oluşturduk.
Şimdi ise yapmamız gereken, ASP.NET ile bunu çalışmamızda göstermek. Bir ASP.NET sayfası oluşturup sayfamızın PAGE_LOAD olayında yazacağımız metodu Literal içerisine yazdıralım.
Default.aspx<div class="kategoriler"> <asp:Literal ID="ltrKategoriler" runat="server"></asp:Literal> </div>
Çalışmamıza ekleyeceğimiz uzaylar
using System.Configuration; using System.Data.OleDb;
Default.aspx.cs
protected void Page_Load(object sender, EventArgs e) { ltrKategoriler.Text = fnKategoriler("0"); } public OleDbConnection fnBaglan() { OleDbConnection bag = new OleDbConnection(ConfigurationManager.ConnectionStrings["accessDB"].ConnectionString); return bag; } public String fnKategoriler(String parKategori_ID) { String strDonen_Deger = ""; OleDbConnection bag = fnBaglan(); OleDbCommand cmdSQL = new OleDbCommand("SELECT kategori_ID, ust_kategori_ID, kategori FROM tblKategoriler WHERE ust_kategori_ID = " + parKategori_ID + "", bag); bag.Open(); OleDbDataReader drSQL = cmdSQL.ExecuteReader(); if (drSQL.HasRows == true) { strDonen_Deger = "<ul>"; while (drSQL.Read() == true) { String strKategori_ID = drSQL["kategori_ID"].ToString(); String strUst_Kategori_ID = drSQL["ust_kategori_ID"].ToString(); String strKategori = drSQL["kategori"].ToString(); strDonen_Deger = strDonen_Deger + "<li>"; strDonen_Deger = strDonen_Deger + "<a href=\"javascript:;\">" + strKategori + " </a>"; strDonen_Deger = strDonen_Deger + fnKategoriler(strKategori_ID); strDonen_Deger = strDonen_Deger + "</li>"; } strDonen_Deger += "</ul>"; } cmdSQL.Dispose(); drSQL.Dispose(); bag.Close(); return strDonen_Deger; }
Örnek
Kaynak: http://www.ontedi.com/aspnet/aspnette-sinirsiz-menu-ve-alt-menu-ornegi-1
-
mantığı anlatmak için olabilcek bir örnek fakat sql sorgu kısmında sql injection var hocam. parametre kullanmalısın.
eline sağlık
FCN tarafından 24/May/15 18:39 tarihinde düzenlenmiştir -
FCN bunu yazdı
mantığı anlatmak için olabilcek bir örnek fakat sql sorgu kısmında sql injection var hocam. parametre kullanmalısın.
eline sağlık
Sonradan farkettim, zaten gelen parametre ziyaretçi taraflı olmadığı için çok sorun olacağını sanmıyorum.
-
Oy oy oy, recursive db query! Bu mantıkla yapacaksanız tabloyu tek seferde çekin, sıramalama olayını JS ile kullanıcının makinesinde halledin.
-
YeniHarman bunu yazdı
Oy oy oy, recursive db query! Bu mantıkla yapacaksanız tabloyu tek seferde çekin, sıramalama olayını JS ile kullanıcının makinesinde halledin.
+1 bu recurvise query çok boktan oluyor. o yüzden yeniharman'ın dediği gibi yapmak gerekiyor. birde self referance'danda kaçınmak-engellemek gerek yoksa infinite loop yüzünden IIS'i patlatıp 12-13 saat sorun nerelerde diye aramak zorunda kalabilirsiniz :D
-
Hocam sp yazın atın generic liste her seferinde menüyü çekmek için db ye gitmeyin hatta birde cache yapın tam olsun.
edit: cache mekanizması için örnek vereyim
public static List<MenuGetirSpResult> MenuGetir ()
{
lock (objLock)//aynı anda ulaşımı çift ulaşımı kitleyerek sıraya alıyoruz
{
if (HttpRuntime.Cache["Menu"] == null)
{
DBDataContext firma = new DBDataContext(Ayarlar.ConnectionString());
List<MenuGetirSpResult> listMenu = firma.MenuGetirSp(null).ToList();
HttpRuntime.Cache.Insert("Menu", listMenu, null, System.Web.Caching.Cache.NoAbsoluteExpiration, TimeSpan.FromDays(30));
}
return HttpRuntime.Cache["Menu"] as List<MenuGetirSpResult>;
}
return HttpRuntime.Cache["Menu"] as List<MenuGetirSpResult>;
}
bunuda menüye ekle/çıkar güncelle işlemlerinin altına eklerseniz
public static void TumCacheyiSil()
{
foreach (System.Collections.DictionaryEntry KeslenmisData in HttpContext.Current.Cache)
{
HttpContext.Current.Cache.Remove(KeslenmisData.Key.ToString());
}
}
NuLL29 tarafından 24/May/15 23:09 tarihinde düzenlenmiştir -
Anakategoriyi nasıl ekliyosun
selectbox ekleyip ordan 1.YeniAnakategori 2.bilgisayar 3.laptop gibi bi şey mi yaptın
Yenianakategorinin selectvaluesunuda 0 yapıp anakategori olarak mı ekletiyosun joinli karmaşık sorgular yerine basit işlerde kullanılır
-
@terror hocam self-reference ne oluyodu.Açıklarmısın biraz daha ayrıntılı.
-
sahinka bunu yazdı
Anakategoriyi nasıl ekliyosun
selectbox ekleyip ordan 1.YeniAnakategori 2.bilgisayar 3.laptop gibi bi şey mi yaptın
Yenianakategorinin selectvaluesunuda 0 yapıp anakategori olarak mı ekletiyosun joinli karmaşık sorgular yerine basit işlerde kullanılır
Selectin varsayılan değeri (ilk değeri) <option value="0">Üst Kategori Olsun..</option> şeklinde belirtiyorum.
Bu arada güzel yönergeler çıkıyor, teşekkürler.
