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>

                    &nbsp;</td>

                <td>

                    &nbsp;</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.

   

 

 

Paylaş

Yorumlar
Yorum Yaz
İsim : (*)
E-mail : (*)
Web Adresi:
(*)
 
Kapat