ASP.net ile alışveriş sepeti yapımı ve sepetin sessionda saklanması
Bu yazıda ASP.net ile Alışveriş Sepeti Örneği Yapıyoruz.
Uygulamanın bittikten sonraki ekran görünüm aşağıdaki gibi olcaktır.

Alışveriş sepetine ürün ekleyeceğiz ve eklediğimiz ürünleri sepetten sileceğiz. Alışveriş sitelerinde kullanılan Sepet uygulamaları kayıt esnasında genel olarak 3 farklı şekilde kullanılıyor. Birincisi sepete eklenen ürünler veritabanında ayrı bir tabloda tutuluyor. İkinci yöntemde sepete eklenen ürünler kullanıcının bilgisayarına atılan bir Cookie de tutulur. Üçüncü ve en çok tercih edilen yöntem ise sepeti Sessionda yani server hafızasında tutmak . Bunların her birini avantaj ve dezavantajları bulunuyor .
1. yöntem ile yapıldığı takdirde sepete eklenen bir ürün Vt de bir tabloda olduğundan ziyaretçi sepetteki ürünü satın almaz ya da silmez ise sepette kalır. Böylece ziyaretçi siteye birdahaki girişinde daha önce eklediği ürünleri görebilir ve tekrar ürünleri aramak zorun kalmaz . Bu yöntemin dezavantajı ise sepete eklenen her ürün Veritabanında tutulduğundan gereksiz verilerin uzun süre tutulmasına sebep olabilir.
2. Yöntemde yani cookie (çerez )de tutulması durumunda sepet kullanıcının bilgisayarında şifrelenmiş bir şekilde tutulur ve ziyaretçinin bir sonraki site ziyaretinde sepetindeki ürünler kullanıcını bilgisayarındaki dosyadan çağırılıp gösterilir . Cookie yöntemin avantajı gereksiz veritabanı kullanımı olmadan sepetteki ürünler ziyaretçiye her seferinde gösterilebilir. Bu yöntemin dezavantajı ise cookie ler ziyaretçinin bilgisayarında tutulduğundan bu küçük dosyaların silinme durumu söz konusudur. Örneğin ziyaretçinin bilgisayarına format atılması durumda. Bir diğer dezavantaj da bazı tarayıcıların cookie alımı güvenlik ya da başka bir nedenden dolayı kapatılmış olabilir.
3. Yöntemde yani Session (oturum) yönteminde ise Sepet server hafızasında tutulur . Server hafızasında tutulma süresi ise ziyaretçinin sepeti boşaltması ya da Tarayıcı penceresini kapatması ile son bulur. Dezavantajı ziyaretçi bir dahaki girişinde sepeti boş olarak bulur.
Şimdi uygulamamıza geçebiliriz. Uygulamada sepeti Data Table nesnesinden faydalanmak istedim. Bunun dışında List ya da diziler gibi yöntemler de kullanılabilir. Datatable nispeten daha kolay olduğundan kullanıyorum . İlk olarak yeni web site açıyoruz ve aşağıdaki gibi bir form oluşturuyoruz.
<table align="center" cellpadding="2" width="300px">
<tr>
<td>
<asp:Label ID="Label1" runat="server" Text="Ürün ID"></asp:Label>
</td>
<td>
:</td>
<td>
<asp:TextBox ID="txtID" runat="server"></asp:TextBox>
</td>
</tr>
<tr>
<td>
<asp:Label ID="Label2" runat="server" Text="Ürün Adı"></asp:Label>
</td>
<td>
:</td>
<td>
<asp:TextBox ID="txtAdi" runat="server"></asp:TextBox>
</td>
</tr>
<tr>
<td>
<asp:Label ID="Label3" runat="server" Text="Fiyat"></asp:Label>
</td>
<td>
:</td>
<td>
<asp:TextBox ID="txtFiyat" runat="server"></asp:TextBox>
</td>
</tr>
<tr>
<td>
<asp:Label ID="Label4" runat="server" Text="Adet"></asp:Label>
</td>
<td>
:</td>
<td>
<asp:TextBox ID="txtAdet" runat="server"></asp:TextBox>
</td>
</tr>
<tr>
<td>
</td>
<td>
</td>
<td>
<asp:Button ID="btnSepeteEkle" runat="server" Text="Sepete Ekle"
onclick="btnSepeteEkle_Click" />
</td>
</tr>
</table>
normal şartlar da ürün bilgileri veritabanından alınır ve her ürün altındaki buton ile sepete eklenir ancak konu dışında olduğundan biz şimdilik manuel olarak yukarıdaki form yardımı ile yapıyor olacağız.
Şimdi Default.aspx.cs dosyamıza geçip kodlara başlayalım.
public void Ekle(string id, string isim, int adet, double fiyat)
{
try
{
DataTable dt = new DataTable(); // sepeti tutacağımız bir datatable oluşturuyoruz
if (HttpContext.Current.Session["sepet"] != null)//daha önceden sepet oluşturulmuş mu diye sessiona bakıyoruz
{
dt = (DataTable)HttpContext.Current.Session["sepet"];//session varsa sessionu datatbale ye cast edip datatablemizi elde ediyoruz
}
else//session yok ise yani sepet daha önce oluşturulup sessiona atılmamış ise dataTableyi oluşturuyoruz
{
dt.Columns.Add("id");// DataTableye id colonunu ekliyoruz
dt.Columns.Add("isim");//DataTableye isim colonunu ekliyoruz
dt.Columns.Add("fiyat");//DataTableye fiyat colonunu ekliyoruz
dt.Columns.Add("adet");//DataTableye adet colonunu ekliyoruz
dt.Columns.Add("tutar");//DataTableye tutar colonunu ekliyoruz
}
bool varmi = Kontrol(id.ToString());//Kontrol adındaki methoda gelen id değerini gönderiyoruz
// böylece aynı id ye sahip ürün daha önce eklendiyse aynı ürünü birdaha eklemek yerine sadece ürünnün sepeteki adetini artıracağız
// Kontrol methodu ürün varsa true yoks false değer döndürüyor
if (varmi == false)//ürün daha önce eklenmemiş ise
{
DataRow drow = dt.NewRow();//yeni bir row (satır) oluşturuluyor.
drow["id"] = id;//satırın id colonuna gelen id yazılıyor.
drow["isim"] = isim;//satırın isim colonuna gelen isim yazılıyor.
drow["fiyat"] = fiyat;//satırın fiyat colonuna gelen fiyat yazılıyor.
drow["adet"] = adet;//satırın adet colonuna gelen adet yazılıyor.
drow["tutar"] = (fiyat * adet).ToString();//satırın tutar alanına gelen fiyat ile adet çarpımı yazılıyor.
dt.Rows.Add(drow);//oluşturulan satır tabloya ekleniyor.
}
else//eğer ürün tabloya daha önce eklenmiş ise
{
Artir(id, adet, fiyat);//Artir methoduna gelen id fiyat ve adet değerleri gönderiliyor. Fiyata gerek yok aslında ama neyse :)
//artir metoduna giddip bakalım şimdi
}
HttpContext.Current.Session["sepet"] = dt;//en son olarak olşturulan DataTable nin sayfa postback olduğunda kaybolmaması için
// sessiona atılıyor. artık birdaki sefere session olduğu için tablo bu sessiondan alınıp üzerine yazılcak
}
catch
{
}
}
Sepete ürünleri eklettik her ürünün tutarını da hesaplattık geriye iki method kaldı. Sil() ve SepetToplam() önce SepetToplam methodunu yazalım .Adından da anlaşılacağı gibi bu mthod sepetteki tüm ürünlerin genel toplamını hesaplayım geri döndürecek.
public double SepetToplam()
{
double toplam = 0;//toplam değişkeni tanımlanıyor
if (HttpContext.Current.Session["sepet"] != null)//sessiomn kontolü yapılıyor
{
DataTable dt = new DataTable();//tablo oluşturuluyor
dt =(DataTable) HttpContext.Current.Session["sepet"];//sessiondaki sepet alınıyor tabloya aktarılıyor
for (int i = 0; i < dt.Rows.Count; i++)//yine tablonun tüm alanlarında dönecek döngü başlatılıyor
{
toplam +=Convert.ToDouble(dt.Rows[i]["tutar"].ToString());//her satırdaki tutar miktarı toplam değişkenine aktarılıyor
}
}
return toplam; //toplam değeri döndürülüyor.
}
Son olarak sepetten ürün silecek olan method.
public void Sil(string id)//silinecek olan ürünün id değeri alınıyor
{
DataTable dt = new DataTable();//tablo örneği oluşturuluyor
if (HttpContext.Current.Session["sepet"] != null)//sessin kontrolü yapılıyor
{
dt = (DataTable)HttpContext.Current.Session["sepet"];//sessiondaki tablo alınıyor
for (int i = 0; i < dt.Rows.Count; i++)//tablonun satır sayısı kadar yine bir döngü oluşturuluyor
{
if (dt.Rows[i]["id"].ToString() == id)//o naki satırın id alanı ile gelen id alanı eşit ise
{
dt.Rows[i].Delete();//tablonun o satırı siliniyor.
HttpContext.Current.Session["sepet"] = dt;//tablonun son hali sessiona aktarılıyor
break;//dögüden çıkılıyor
}
}
}
}
Artir Ve Kontrol Methodları
private bool Kontrol(string id)//gelen ürün id si alınıyor
{
bool r = false;//dönüş değeri tanımlanıyor
DataTable dt = new DataTable();//tablo luşturutuluyor
if (HttpContext.Current.Session["sepet"] != null)//session boş değilse işleme başlanıyor
{
dt = (DataTable)HttpContext.Current.Session["sepet"];//sessiondaki bilgiler tabloya alınıyor
for (int i = 0; i < dt.Rows.Count; i++)//tablonun içindeki satırlara tek tek dönügü ile bakıloyor
{
if (dt.Rows[i]["id"].ToString() == id)//eğer o anki satırın id alanı ile gelen id alanı eşit ise
{
r = true;// dömüş değeri true yapılıyor ve dmngüden çıkılıyor.
break;
}
}
}
return r;//geri değer dönürülüyor ürün varsa true yoksa false dönecek
}
private void Artir(string id, int adet, double fiyat)//değerler alınıyor
{
try
{
DataTable dt = new DataTable();//tablo oluşturuluyor
dt = (DataTable)HttpContext.Current.Session["sepet"];//sessiondaki tablo alınıyor
for (int i = 0; i < dt.Rows.Count; i++)//tablonun tüm satırlarında dönülüyor
{
if (dt.Rows[i]["id"].ToString() == id)//eğer gelen id ile o anki satırın id değeri eşit ise
{
int adet1 = Convert.ToInt32(dt.Rows[i]["adet"].ToString());//o anfdaki ürün adeti geçici bir değişkene atanıyor
adet1 += adet;//eski adete yeni gelen adet ekleniyor.
dt.Rows[i]["adet"] = adet1.ToString();//ve o tablonun adet alanına toplam adet ekleniyor
double tutar1 = Convert.ToDouble(dt.Rows[i]["tutar"].ToString());//tutar alanı geçici değişkene atanıyor.
tutar1 = (adet * Convert.ToDouble(dt.Rows[i]["fiyat"])) + tutar1;//yeni tutar yeni adete göre hesaplanıyor
dt.Rows[i]["tutar"] = tutar1.ToString();//yeni tutar tabloya ekleniyor
HttpContext.Current.Session["sepet"] = dt;//tablonun son hali sessiona atılıyor
break;//döngüden çıkılıyor.
}
}
}
catch
{
}
}
Sepeti oluşturduğuma göre artık ekranda göstermeye geldi sıra. Bunun için herhangi bir datasontolü kullanılabilir ben DataList kullandım. HTML Kodu aşaıdaki gibi
<asp:DataList ID="DataList1" runat="server" CellPadding="4"
onitemcommand="DataList1_ItemCommand" ForeColor="#333333"
BorderColor="Black" BorderWidth="1px" CellSpacing="2" Font-Bold="False"
Font-Italic="False" Font-Overline="False" Font-Strikeout="False"
Font-Underline="False" HorizontalAlign="Center" ShowFooter="False">
<FooterStyle BackColor="#5D7B9D" ForeColor="White" Font-Bold="True" />
<AlternatingItemStyle BackColor="White" ForeColor="#284775" />
<ItemStyle BackColor="#DEDFDE" ForeColor="Black" />
<SelectedItemStyle BackColor="#E2DED6" Font-Bold="True" ForeColor="#333333" />
<HeaderTemplate>
<table align="center" cellpadding="3" cellspacing="3" width="400">
<tr>
<td align="left" width="10px">
ID</td>
<td align="left" width="100px">
AD</td>
<td align="left" width="30px">
FIYAT</td>
<td align="left" width="15px">
ADET</td>
<td align="left" width="50px">
TUTAR</td>
<td align="center" width="10px">
SİL</td>
</tr>
</table>
</HeaderTemplate>
<HeaderStyle BackColor="#5D7B9D" Font-Bold="True" ForeColor="White" />
<ItemTemplate>
<table align="center" cellpadding="3" cellspacing="3" width="400">
<tr>
<td align="left" width="10px">
<%# Eval("id") %></td>
<td align="left" width="100px">
<%# Eval("isim") %></td>
<td align="left" width="30px">
<%# Eval("fiyat") %></td>
<td align="left" width="15px">
<%# Eval("adet") %></td>
<td align="left" width="50px">
<%# Eval("tutar") %></td>
<td align="center" width="10px">
<asp:LinkButton ID="btnSil" runat="server" CommandArgument='<%# Eval("id") %>' CommandName="sil">Sil</asp:LinkButton></td>
</tr>
</table>
</ItemTemplate>
</asp:DataList>
<br />
<center> <asp:Label ID="lblToplam" runat="server"></asp:Label></center>
Sayfamızın Page_Load oyında sepeti çağırıyoruz tabi bunun içinde bir method yazalım ki herseferinde tekrar tekrar sepeti çağırmak için kod yazmayalım.
SepetGetir methodu sessiodaki tabloyu dataliste datasource olarak bağlayacak ve sepet toplamını label e yazdıracak .
private void SepetGetir()
{
if (Session["sepet"] != null)
{
DataTable dt = new DataTable();
dt = (DataTable)Session["sepet"];
DataList1.DataSource = dt.DefaultView;
DataList1.DataBind();
lblToplam.Text = "Toplam : " + SepetToplam().ToString() + " TL.";
}
}
Sayfanın ilk açılışında sepeti getirmesi için kodu yazalım
protected void Page_Load(object sender, EventArgs e)
{
if(!IsPostBack)
SepetGetir();
}
Sil butonunun çalışması için datalistin ItemCommand eventine aşağıdaki kodu ekliyoruz tabi yukarıdaki html koddaki gibi Link butonun CommandName ve CommandArgument özelliklerini verdikten sonra.
protected void DataList1_ItemCommand(object source, DataListCommandEventArgs e)
{
if (e.CommandName.ToString() == "sil")//command name sil ise
{
Sil(e.CommandArgument.ToString());//yazdığımız sil methoduna o anki ürünün id değerini gönderiyoruz
SepetGetir();// sepetin son halini birdaha ekrana getiriyoruz
}
}
Görüşmek Üzere.