Alışveriş Sepeti

by Erik Reitan

Wingtip Toys örnek projesini indirin (C#) veya indirme E-kitabı (PDF)

Bu öğretici serisi, ASP.NET 4,5 ve Web için Microsoft Visual Studio Express 2013 kullanarak bir ASP.NET Web Forms uygulaması oluşturma hakkında temel bilgileri öğretir. Kaynak koduna sahip C# Visual Studio 2013 bir proje, bu öğretici serisine eşlik etmek için kullanılabilir.

Bu öğretici, Wingtip Toys örnek ASP.NET Web Forms uygulamasına bir alışveriş sepeti eklemek için gereken iş mantığını açıklamaktadır. Bu öğretici, önceki öğreticide "veri öğelerini ve ayrıntılarını görüntüleme" ve Wingtip oyuncak mağaza öğreticisi serisinin bir parçası olarak oluşturulur. Bu öğreticiyi tamamladığınızda, örnek uygulamanızın kullanıcıları alışveriş sepetindeki ürünleri ekleyebilir, kaldırabilir ve değiştirebilir.

Öğrenecekleriniz:

  1. Web uygulaması için bir alışveriş sepeti oluşturma.
  2. Kullanıcıların alışveriş sepetine öğe eklemesini sağlama.
  3. Alışveriş sepeti ayrıntılarını göstermek için bir GridView denetimi ekleme.
  4. Sipariş toplamını hesaplama ve görüntüleme.
  5. Alışveriş sepetindeki öğeleri kaldırma ve güncelleştirme.
  6. Bir alışveriş sepeti sayacı ekleme.

Bu öğreticideki kod özellikleri:

  1. Entity Framework Code First
  2. Veri Açıklamaları
  3. Kesin tür belirtilmiş veri denetimleri
  4. Model bağlama

Alışveriş sepeti oluşturma

Bu öğretici serisinde daha önce, bir veritabanından ürün verilerini görüntülemek için sayfa ve kod eklediniz. Bu öğreticide, kullanıcıların satın alma ile ilgilenen ürünleri yönetmek için bir alışveriş sepeti oluşturacaksınız. Kullanıcılar kayıtlı veya oturum açmış olmasalar bile alışveriş sepetine gözatabilecek ve bunlara öğe ekleyebilecektir. Alışveriş sepetini erişimini yönetmek için, Kullanıcı ilk kez alışveriş sepetine eriştiğinde bir genel benzersiz tanımlayıcı (GUID) kullanarak kullanıcılara benzersiz bir ID atayacaksınız. Bu ID ASP.NET oturum durumunu kullanarak depolayacaksınız.

Note

ASP.NET oturum durumu, Kullanıcı siteden ayrıldıktan sonra sona erecektir kullanıcıya özgü bilgileri depolamak için uygun bir yerdir. Oturum durumunun kötüye kullanımı daha büyük sitelerde performans etkilerine sahip olsa da, oturum durumunun hafif kullanımı, tanıtım amacıyla iyi bir şekilde çalışacaktır. Wingtip Toys örnek projesi, oturum durumunun, siteyi barındıran Web sunucusunda işlem içinde depolandığı bir dış sağlayıcı olmadan nasıl kullanılacağını gösterir. Bir uygulamanın birden çok örneğini veya farklı sunuculardaki bir uygulamanın birden çok örneğini çalıştıran siteleri sağlayan daha büyük siteler için, Windows Azure önbellek hizmeti'ni kullanmayı düşünün. Bu önbellek hizmeti, Web sitesi dışında bir dağıtılmış önbelleğe alma hizmeti sağlar ve işlem içi oturum durumunu kullanma sorununu çözer. Daha fazla bilgi için bkz. Windows Azure Web siteleri ile ASP.NET oturum durumunu kullanma.

Bir model sınıfı olarak Cartıtem ekleme

Bu öğretici serisinde daha önce, modeller klasöründe Category ve Product sınıfları oluşturarak kategori ve ürün verilerinin şemasını tanımlamış olursunuz. Şimdi, alışveriş sepeti için şemayı tanımlamak üzere yeni bir sınıf ekleyin. Bu öğreticide daha sonra, CartItem tablosuna veri erişimini işlemek için bir sınıf ekleyeceksiniz. Bu sınıf, alışveriş sepetindeki öğeleri eklemek, kaldırmak ve güncelleştirmek için iş mantığı sağlar.

  1. Modeller klasörüne sağ tıklayın ve yeni öğe> -Ekle ' yi seçin.

    Alışveriş sepeti-yeni öğe

  2. Yeni öğe Ekle iletişim kutusu görüntülenir. Koduseçin ve ardından sınıf' ı seçin.

    Alışveriş sepeti-yeni öğe Ekle Iletişim kutusu

  3. Bu yeni sınıfı CartItem.csolarak adlandırın.

  4. Ekle'yi tıklatın.
    Yeni sınıf dosyası düzenleyicide görüntülenir.

  5. Varsayılan kodu şu kodla değiştirin:

    using System.ComponentModel.DataAnnotations;
    
    namespace WingtipToys.Models
    {
        public class CartItem
        {
            [Key]
            public string ItemId { get; set; }
    
            public string CartId { get; set; }
    
            public int Quantity { get; set; }
    
            public System.DateTime DateCreated { get; set; }
    
            public int ProductId { get; set; }
    
            public virtual Product Product { get; set; }
    
        }
    }
    

CartItem sınıfı, bir kullanıcının alışveriş sepetine eklediği her bir ürünü tanımlayan şemayı içerir. Bu sınıf, bu öğretici serisinde daha önce oluşturduğunuz diğer şema sınıflarına benzer. Kurala göre Entity Framework Code First, CartItem tablosunun birincil anahtarının CartItemId veya IDolacağını bekler. Ancak, kod, Data Annotation [Key] özniteliğini kullanarak varsayılan davranışı geçersiz kılar. ItemId özelliğinin Key özniteliği, ItemID özelliğinin birincil anahtar olduğunu belirtir.

CartId özelliği, satın alınacak öğeyle ilişkili kullanıcının ID belirtir. Kullanıcı alışveriş sepetine eriştiğinde bu kullanıcı ID oluşturmak için kod ekleyeceksiniz. Bu ID, bir ASP.NET oturum değişkeni olarak da depolanacak.

Ürün bağlamını güncelleştirme

CartItem sınıfı eklemenin yanı sıra, varlık sınıflarını yöneten ve veritabanına veri erişimi sağlayan veritabanı bağlamı sınıfını güncelleştirmeniz gerekir. Bunu yapmak için, yeni oluşturulan CartItem modeli sınıfını ProductContext sınıfına ekleyeceksiniz.

  1. Çözüm Gezgini, modeller klasöründe ProductContext.cs dosyasını bulup açın.

  2. Vurgulanan kodu ProductContext.cs dosyasına aşağıdaki şekilde ekleyin:

    using System.Data.Entity;
     
    namespace WingtipToys.Models
    {
        public class ProductContext : DbContext
        {
            public ProductContext()
                : base("WingtipToys")
            {
            }
     
            public DbSet<Category> Categories { get; set; }
            public DbSet<Product> Products { get; set; }
            public DbSet<CartItem> ShoppingCartItems { get; set; }
        }
    }
    

Bu öğretici serisinde daha önce bahsedildiği gibi, ProductContext.cs dosyasındaki kod System.Data.Entity ad alanını ekleyerek Entity Framework tüm çekirdek işlevlerine erişebilirsiniz. Bu işlevsellik, türü kesin belirlenmiş nesnelerle çalışarak verileri sorgulama, ekleme, güncelleştirme ve silme özelliğini içerir. ProductContext sınıfı, yeni eklenen CartItem model sınıfına erişim ekler.

Alışveriş sepetini Iş mantığını yönetme

Sonra, ShoppingCart sınıfını yeni bir mantıksal klasörde oluşturacaksınız. ShoppingCart sınıfı CartItem tabloya veri erişimini işler. Bu sınıf, alışveriş sepetindeki öğeleri eklemek, kaldırmak ve güncelleştirmek için iş mantığını da içerir.

Ekleyeceğiniz alışveriş sepeti mantığı aşağıdaki eylemleri yönetmek için gereken işlevselliği içerir:

  1. Alışveriş sepetine öğe ekleme
  2. Alışveriş sepetinden öğeleri kaldırma
  3. Alışveriş sepeti KIMLIĞINI alma
  4. Alışveriş sepetinden öğe alma
  5. Tüm alışveriş sepeti öğelerinin miktarını Toplam olarak alma
  6. Alışveriş sepeti verilerini güncelleştirme

Alışveriş sepeti verilerine erişmek için bir alışveriş sepeti sayfası (ShoppingCart. aspx) ve alışveriş sepeti sınıfı birlikte kullanılacaktır. Alışveriş sepeti sayfası, kullanıcının alışveriş sepetine eklediği tüm öğeleri görüntüler. Alışveriş sepeti sayfasının ve sınıfının yanı sıra, alışveriş sepetine ürün eklemek için bir sayfa (AddToCart. aspx) oluşturacaksınız. Ayrıca, ProductList. aspx sayfasına ve AddToCart. aspx sayfasına bir bağlantı sağlayacak olan ProductDetails. aspx sayfasına kod ekleyeceksiniz. böylece, kullanıcının alışveriş sepetine ürün ekleyebilmesi gerekir.

Aşağıdaki diyagramda, Kullanıcı alışveriş sepetine bir ürün eklediğinde oluşan temel işlem gösterilmektedir.

Alışveriş sepeti-alışveriş sepetine ekleme

Kullanıcı ProductList. aspx sayfasında veya ProductDetails. aspx sayfasında sepet Ekle bağlantısına tıkladığında, uygulama AddToCart. aspx sayfasına ve ardından otomatik olarak ShoppingCart. aspx sayfasına gider. AddToCart. aspx sayfası, ShoppingCart sınıfında bir yöntemi çağırarak, select ürünü alışveriş sepetine ekler. ShoppingCart. aspx sayfasında, alışveriş sepetine eklenmiş ürünler görüntülenir.

Alışveriş sepeti sınıfı oluşturma

ShoppingCart sınıfı uygulamadaki ayrı bir klasöre eklenir, böylece model (modeller klasörü), sayfalar (kök klasörü) ve Logic (Logic Folder) arasında net bir ayrım olur.

  1. Çözüm Gezgini, wingtiptoysprojesine sağ tıklayın ve Yeni klasör>-Ekle ' yi seçin. Yeni klasör mantığınıadlandırın.

  2. Logic klasörüne sağ tıklayın ve ardından yeni öğe> -Ekle ' yi seçin.

  3. ShoppingCartActions.csadlı yeni bir sınıf dosyası ekleyin.

  4. Varsayılan kodu şu kodla değiştirin:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using WingtipToys.Models;
    
    namespace WingtipToys.Logic
    {
      public class ShoppingCartActions : IDisposable
      {
        public string ShoppingCartId { get; set; }
    
        private ProductContext _db = new ProductContext();
    
        public const string CartSessionKey = "CartId";
    
        public void AddToCart(int id)
        {
          // Retrieve the product from the database.           
          ShoppingCartId = GetCartId();
    
          var cartItem = _db.ShoppingCartItems.SingleOrDefault(
              c => c.CartId == ShoppingCartId
              && c.ProductId == id);
          if (cartItem == null)
          {
            // Create a new cart item if no cart item exists.                 
            cartItem = new CartItem
            {
              ItemId = Guid.NewGuid().ToString(),
              ProductId = id,
              CartId = ShoppingCartId,
              Product = _db.Products.SingleOrDefault(
               p => p.ProductID == id),
              Quantity = 1,
              DateCreated = DateTime.Now
            };
    
            _db.ShoppingCartItems.Add(cartItem);
          }
          else
          {
            // If the item does exist in the cart,                  
            // then add one to the quantity.                 
            cartItem.Quantity++;
          }
          _db.SaveChanges();
        }
    
        public void Dispose()
        {
          if (_db != null)
          {
            _db.Dispose();
            _db = null;
          }
        }
    
        public string GetCartId()
        {
          if (HttpContext.Current.Session[CartSessionKey] == null)
          {
            if (!string.IsNullOrWhiteSpace(HttpContext.Current.User.Identity.Name))
            {
              HttpContext.Current.Session[CartSessionKey] = HttpContext.Current.User.Identity.Name;
            }
            else
            {
              // Generate a new random GUID using System.Guid class.     
              Guid tempCartId = Guid.NewGuid();
              HttpContext.Current.Session[CartSessionKey] = tempCartId.ToString();
            }
          }
          return HttpContext.Current.Session[CartSessionKey].ToString();
        }
    
        public List<CartItem> GetCartItems()
        {
          ShoppingCartId = GetCartId();
    
          return _db.ShoppingCartItems.Where(
              c => c.CartId == ShoppingCartId).ToList();
        }
      }
    }
    

AddToCart yöntemi, bireysel ürünlerin ürün IDgöre alışveriş sepetine dahil edilmesini sağlar. Ürün sepete eklenir veya sepet zaten bu ürün için bir öğe içeriyorsa, miktar artırılır.

GetCartId yöntemi kullanıcı için sepet ID döndürür. Sepet ID, bir kullanıcının alışveriş sepetindeki öğeleri izlemek için kullanılır. Kullanıcının mevcut bir sepet IDyoksa, bu ID yeni bir sepet oluşturulur. Kullanıcı kayıtlı bir kullanıcı olarak oturum açmışsa, sepet ID Kullanıcı adına ayarlanır. Ancak, Kullanıcı oturum açmamışsa, sepet ID benzersiz bir değer (bir GUID) olarak ayarlanır. Bir GUID, oturum temelinde her bir kullanıcı için yalnızca bir sepet oluşturulmasını sağlar.

GetCartItems yöntemi, Kullanıcı için alışveriş sepeti öğelerinin bir listesini döndürür. Bu öğreticide daha sonra, GetCartItems yöntemi kullanılarak alışveriş sepetindeki sepet öğelerini görüntülemek için model bağlamanın kullanıldığını görürsünüz.

Sepetin ekleme Işlevini oluşturma

Daha önce belirtildiği gibi, kullanıcının alışveriş sepetine yeni ürünler eklemek için kullanılacak AddToCart. aspx adlı bir işleme sayfası oluşturacaksınız. Bu sayfa, yeni oluşturduğunuz ShoppingCart sınıfında AddToCart yöntemini çağırır. AddToCart. aspx sayfası bir ürün ID geçtiğini bekler. Bu ürün ID, ShoppingCart sınıfında AddToCart yöntemi çağrılırken kullanılacaktır.

Note

Sayfa Kullanıcı arabirimi (AddToCart. aspx) değil, Bu sayfa için arka plan kodunu (AddToCart.aspx.cs) değiştiriyorsunuz.

Add-cart işlevini oluşturmak için:

  1. Çözüm Gezgini, wingtiptoysprojesine sağ tıklayın, Yeni öğe> -Ekle ' ye tıklayın.
    Yeni öğe Ekle iletişim kutusu görüntülenir.

  2. AddToCart. aspxadlı uygulamaya standart yeni bir sayfa (Web formu) ekleyin.

    Alışveriş sepeti-Web formu ekleme

  3. Çözüm Gezgini, AddToCart. aspx sayfasına sağ tıklayıp kodu görüntüle' ye tıklayın. AddToCart.aspx.cs arka plan kod dosyası düzenleyicide açılır.

  4. AddToCart.aspx.cs kodundaki mevcut kodu aşağıdaki kodla değiştirin:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Diagnostics;
    using WingtipToys.Logic;
    
    namespace WingtipToys
    {
      public partial class AddToCart : System.Web.UI.Page
      {
        protected void Page_Load(object sender, EventArgs e)
        {
          string rawId = Request.QueryString["ProductID"];
          int productId;
          if (!String.IsNullOrEmpty(rawId) && int.TryParse(rawId, out productId))
          {
            using (ShoppingCartActions usersShoppingCart = new ShoppingCartActions())
            {
              usersShoppingCart.AddToCart(Convert.ToInt16(rawId));
            }
    
          }
          else
          {
            Debug.Fail("ERROR : We should never get to AddToCart.aspx without a ProductId.");
            throw new Exception("ERROR : It is illegal to load AddToCart.aspx without setting a ProductId.");
          }
          Response.Redirect("ShoppingCart.aspx");
        }
      }
    }
    

AddToCart. aspx sayfası yüklendiğinde, ürün ID sorgu dizesinden alınır. Ardından, alışveriş sepeti sınıfının bir örneği oluşturulur ve bu öğreticide daha önce eklediğiniz AddToCart yöntemini çağırmak için kullanılır. ShoppingCartActions.cs dosyasında bulunan AddToCart yöntemi, seçili ürünü alışveriş sepetine ekleme veya seçili ürünün ürün miktarını artırma mantığını içerir. Ürün, alışveriş sepetine eklenmemişse, ürün veritabanının CartItem tablosuna eklenir. Ürün, alışveriş sepetine zaten eklendiyse ve Kullanıcı aynı ürüne ek bir öğe eklerse, CartItem tablosunda ürün miktarı artırılır. Son olarak, sayfa, kullanıcının sepetteki öğelerin güncelleştirilmiş bir listesini gördüğü bir sonraki adımda ekleyeceğiniz ShoppingCart. aspx sayfasına yeniden yönlendirilir.

Daha önce belirtildiği gibi, bir Kullanıcı ID, belirli bir kullanıcıyla ilişkili ürünleri belirlemek için kullanılır. Bu ID, Kullanıcı alışveriş sepetine her ürün eklediğinde CartItem tablosundaki bir satıra eklenir.

Alışveriş sepeti Kullanıcı arabirimi oluşturma

ShoppingCart. aspx sayfası, kullanıcının kendi alışveriş sepetine eklediği ürünleri görüntüler. Ayrıca, alışveriş sepetindeki öğeleri ekleme, kaldırma ve güncelleştirme olanağı da sağlar.

  1. Çözüm Gezgini, wingtiptoys' a sağ tıklayın, Yeni öğe> -Ekle ' ye tıklayın.
    Yeni öğe Ekle iletişim kutusu görüntülenir.

  2. Ana sayfa kullanarak Web formu' nu seçerek ana sayfa içeren yeni bir sayfa (Web formu) ekleyin. Yeni sayfayı ShoppingCart. aspxolarak adlandırın.

  3. Ana sayfayı yeni oluşturulan . aspx sayfasına eklemek için site. Master ' u seçin.

  4. ShoppingCart. aspx sayfasında, varolan biçimlendirmeyi aşağıdaki biçimlendirme ile değiştirin:

    <%@ Page Title="" Language="C#" MasterPageFile="~/Site.Master" AutoEventWireup="true" CodeBehind="ShoppingCart.aspx.cs" Inherits="WingtipToys.ShoppingCart" %>
    <asp:Content ID="Content1" ContentPlaceHolderID="MainContent" runat="server">
        <div id="ShoppingCartTitle" runat="server" class="ContentHead"><h1>Shopping Cart</h1></div>
        <asp:GridView ID="CartList" runat="server" AutoGenerateColumns="False" ShowFooter="True" GridLines="Vertical" CellPadding="4"
            ItemType="WingtipToys.Models.CartItem" SelectMethod="GetShoppingCartItems" 
            CssClass="table table-striped table-bordered" >   
            <Columns>
            <asp:BoundField DataField="ProductID" HeaderText="ID" SortExpression="ProductID" />        
            <asp:BoundField DataField="Product.ProductName" HeaderText="Name" />        
            <asp:BoundField DataField="Product.UnitPrice" HeaderText="Price (each)" DataFormatString="{0:c}"/>     
            <asp:TemplateField   HeaderText="Quantity">            
                    <ItemTemplate>
                        <asp:TextBox ID="PurchaseQuantity" Width="40" runat="server" Text="<%#: Item.Quantity %>"></asp:TextBox> 
                    </ItemTemplate>        
            </asp:TemplateField>    
            <asp:TemplateField HeaderText="Item Total">            
                    <ItemTemplate>
                        <%#: String.Format("{0:c}", ((Convert.ToDouble(Item.Quantity)) *  Convert.ToDouble(Item.Product.UnitPrice)))%>
                    </ItemTemplate>        
            </asp:TemplateField> 
            <asp:TemplateField HeaderText="Remove Item">            
                    <ItemTemplate>
                        <asp:CheckBox id="Remove" runat="server"></asp:CheckBox>
                    </ItemTemplate>        
            </asp:TemplateField>    
            </Columns>    
        </asp:GridView>
        <div>
            <p></p>
            <strong>
                <asp:Label ID="LabelTotalText" runat="server" Text="Order Total: "></asp:Label>
                <asp:Label ID="lblTotal" runat="server" EnableViewState="false"></asp:Label>
            </strong> 
        </div>
        <br />
    </asp:Content>
    

ShoppingCart. aspx sayfası, CartListadlı bir GridView denetimi içerir. Bu denetim, alışveriş sepeti verilerini veritabanından GridView denetimine bağlamak için model bağlamayı kullanır. GridView denetiminin ItemType özelliğini ayarladığınızda, Item veri bağlama ifadesi denetimin biçimlendirmesinde kullanılabilir ve denetim kesin bir şekilde türdedir. Bu öğretici serisinde daha önce bahsedildiği gibi, IntelliSense kullanarak Item nesnesinin ayrıntılarını seçebilirsiniz. Veri seçmek üzere model bağlamayı kullanmak üzere bir veri denetimi yapılandırmak için denetimin SelectMethod özelliğini ayarlarsınız. Yukarıdaki biçimlendirmede SelectMethod, bir CartItem nesnelerinin listesini döndüren Getshoppingcartıtems metodunu kullanacak şekilde ayarlarsınız. GridView veri denetimi, yöntemi sayfa yaşam döngüsünde uygun zamanda çağırır ve döndürülen verileri otomatik olarak bağlar. GetShoppingCartItems yöntemi yine de eklenmelidir.

Alışveriş sepeti öğelerini alma

Ardından, alışveriş sepeti Kullanıcı arabirimini almak ve doldurmak için ShoppingCart.aspx.cs arka planda kod eklersiniz.

  1. Çözüm Gezgini, ShoppingCart. aspx sayfasına sağ tıklayın ve sonra kodu görüntüle' ye tıklayın. ShoppingCart.aspx.cs arka plan kod dosyası düzenleyicide açılır.

  2. Mevcut kodu şu kodla değiştirin:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using WingtipToys.Models;
    using WingtipToys.Logic;
    
    namespace WingtipToys
    {
      public partial class ShoppingCart : System.Web.UI.Page
      {
        protected void Page_Load(object sender, EventArgs e)
        {
    
        }
    
        public List<CartItem> GetShoppingCartItems()
        {
          ShoppingCartActions actions = new ShoppingCartActions();
          return actions.GetCartItems();
        }
      }
    }
    

Yukarıda belirtildiği gibi, GridView Data Control, GetShoppingCartItems yöntemini sayfa yaşam döngüsünde uygun zamanda çağırır ve döndürülen verileri otomatik olarak bağlar. GetShoppingCartItems yöntemi ShoppingCartActions nesnesinin bir örneğini oluşturur. Daha sonra kod, GetCartItems yöntemini çağırarak sepetteki öğeleri döndürmek için bu örneği kullanır.

Alışveriş sepetine ürün ekleme

ProductList. aspx veya ProductDetails. aspx sayfası görüntülendiğinde, Kullanıcı bir bağlantı kullanarak ürünü alışveriş sepetine ekleyebilecektir. Bağlantıyı tıkladıklarında, uygulama AddToCart. aspxadlı işleme sayfasına gider. AddToCart. aspx sayfası, bu öğreticide daha önce eklediğiniz ShoppingCart sınıfında AddToCart yöntemini çağırır.

Şimdi, ProductList. aspx sayfasına ve ProductDetails. aspx sayfasına bir sepet Ekle bağlantısı ekleyeceksiniz. Bu bağlantı, veritabanından alınan ürün ID içerecektir.

  1. Çözüm Gezgini, ProductList. aspxadlı sayfayı bulup açın.

  2. Tüm sayfanın aşağıdaki gibi görünmesi için, sarıya vurgulanan biçimlendirmeyi ProductList. aspx sayfasına ekleyin:

    <%@ Page Title="Products" Language="C#" MasterPageFile="~/Site.Master" AutoEventWireup="true" 
             CodeBehind="ProductList.aspx.cs" Inherits="WingtipToys.ProductList" %>
    <asp:Content ID="Content1" ContentPlaceHolderID="MainContent" runat="server">
        <section>
            <div>
                <hgroup>
                    <h2><%: Page.Title %></h2>
                </hgroup>
    
                <asp:ListView ID="productList" runat="server" 
                    DataKeyNames="ProductID" GroupItemCount="4"
                    ItemType="WingtipToys.Models.Product" SelectMethod="GetProducts">
                    <EmptyDataTemplate>
                        <table runat="server">
                            <tr>
                                <td>No data was returned.</td>
                            </tr>
                        </table>
                    </EmptyDataTemplate>
                    <EmptyItemTemplate>
                        <td runat="server" />
                    </EmptyItemTemplate>
                    <GroupTemplate>
                        <tr id="itemPlaceholderContainer" runat="server">
                            <td id="itemPlaceholder" runat="server"></td>
                        </tr>
                    </GroupTemplate>
                    <ItemTemplate>
                        <td runat="server">
                            <table>
                                <tr>
                                    <td>
                                        <a href="ProductDetails.aspx?productID=<%#:Item.ProductID%>">
                                            <img src="/Catalog/Images/Thumbs/<%#:Item.ImagePath%>"
                                                width="100" height="75" style="border: solid" /></a>
                                    </td>
                                </tr>
                                <tr>
                                    <td>
                                        <a href="ProductDetails.aspx?productID=<%#:Item.ProductID%>">
                                            <span>
                                                <%#:Item.ProductName%>
                                            </span>
                                        </a>
                                        <br />
                                        <span>
                                            <b>Price: </b><%#:String.Format("{0:c}", Item.UnitPrice)%>
                                        </span>
                                        <br />
                                        <a href="/AddToCart.aspx?productID=<%#:Item.ProductID %>">               
                                            <span class="ProductListItem">
                                                <b>Add To Cart<b>
                                            </span>           
                                        </a>
                                    </td>
                                </tr>
                                <tr>
                                    <td>&nbsp;</td>
                                </tr>
                            </table>
                            </p>
                        </td>
                    </ItemTemplate>
                    <LayoutTemplate>
                        <table runat="server" style="width:100%;">
                            <tbody>
                                <tr runat="server">
                                    <td runat="server">
                                        <table id="groupPlaceholderContainer" runat="server" style="width:100%">
                                            <tr id="groupPlaceholder" runat="server"></tr>
                                        </table>
                                    </td>
                                </tr>
                                <tr runat="server">
                                    <td runat="server"></td>
                                </tr>
                                <tr></tr>
                            </tbody>
                        </table>
                    </LayoutTemplate>
                </asp:ListView>
            </div>
        </section>
    </asp:Content>
    

Alışveriş sepetini test etme

Satın alma sepetini ürün eklemeyi öğrenmek için uygulamayı çalıştırın.

  1. Uygulamayı çalıştırmak için F5'e basın.
    Proje veritabanını yeniden oluşturduktan sonra, tarayıcı açılır ve varsayılan. aspx sayfasını gösterir.

  2. Kategori gezinti menüsünde otomobiller ' i seçin.
    ProductList. aspx sayfası yalnızca "otomobiller" kategorisinde bulunan ürünlerin gösterildiği görüntülenir.

    Alışveriş sepeti-otomobiller

  3. Listelenen ilk ürünün yanındaki sepet Ekle bağlantısına tıklayın (dönüştürülebilir otomobil).
    Alışveriş sepetinizdeki seçimi gösteren ShoppingCart. aspx sayfası görüntülenir.

    Alışveriş sepeti-sepet

  4. Kategori gezinti menüsünden düzlemler ' i seçerek ek ürünleri görüntüleyin.

  5. Listelenen ilk ürünün yanındaki sepet Ekle bağlantısına tıklayın.
    ShoppingCart. aspx sayfası ek öğeyle birlikte görüntülenir.

  6. Tarayıcıyı kapatın.

Sipariş toplamını hesaplama ve görüntüleme

Alışveriş sepetine ürün eklemeye ek olarak, ShoppingCart sınıfına bir GetTotal yöntemi ekleyecek ve alışveriş sepeti sayfasında toplam sipariş miktarını görüntüleyecek olursunuz.

  1. Çözüm Gezgini' de, ShoppingCartActions.cs dosyasını Logic klasöründe açın.

  2. Aşağıdaki GetTotal yöntemini sarı olarak vurgulanmış şekilde ShoppingCart sınıfına ekleyin:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using WingtipToys.Models;
    
    namespace WingtipToys.Logic
    {
      public class ShoppingCartActions : IDisposable
      {
        public string ShoppingCartId { get; set; }
    
        private ProductContext _db = new ProductContext();
    
        public const string CartSessionKey = "CartId";
    
        public void AddToCart(int id)
        {
          // Retrieve the product from the database.           
          ShoppingCartId = GetCartId();
    
          var cartItem = _db.ShoppingCartItems.SingleOrDefault(
              c => c.CartId == ShoppingCartId
              && c.ProductId == id);
          if (cartItem == null)
          {
            // Create a new cart item if no cart item exists.                 
            cartItem = new CartItem
            {
              ItemId = Guid.NewGuid().ToString(),
              ProductId = id,
              CartId = ShoppingCartId,
              Product = _db.Products.SingleOrDefault(
               p => p.ProductID == id),
              Quantity = 1,
              DateCreated = DateTime.Now
            };
    
            _db.ShoppingCartItems.Add(cartItem);
          }
          else
          {
            // If the item does exist in the cart,                  
            // then add one to the quantity.                 
            cartItem.Quantity++;
          }
          _db.SaveChanges();
        }
    
        public void Dispose()
        {
          if (_db != null)
          {
            _db.Dispose();
            _db = null;
          }
        }
    
        public string GetCartId()
        {
          if (HttpContext.Current.Session[CartSessionKey] == null)
          {
            if (!string.IsNullOrWhiteSpace(HttpContext.Current.User.Identity.Name))
            {
              HttpContext.Current.Session[CartSessionKey] = HttpContext.Current.User.Identity.Name;
            }
            else
            {
              // Generate a new random GUID using System.Guid class.     
              Guid tempCartId = Guid.NewGuid();
              HttpContext.Current.Session[CartSessionKey] = tempCartId.ToString();
            }
          }
          return HttpContext.Current.Session[CartSessionKey].ToString();
        }
    
        public List<CartItem> GetCartItems()
        {
          ShoppingCartId = GetCartId();
    
          return _db.ShoppingCartItems.Where(
              c => c.CartId == ShoppingCartId).ToList();
        }
    
        public decimal GetTotal()
        {
          ShoppingCartId = GetCartId();
          // Multiply product price by quantity of that product to get        
          // the current price for each of those products in the cart.  
          // Sum all product price totals to get the cart total.   
          decimal? total = decimal.Zero;
          total = (decimal?)(from cartItems in _db.ShoppingCartItems
                             where cartItems.CartId == ShoppingCartId
                             select (int?)cartItems.Quantity *
                             cartItems.Product.UnitPrice).Sum();
          return total ?? decimal.Zero;
        }
      }
    }
    

İlk olarak, GetTotal yöntemi kullanıcı için alışveriş sepetinin KIMLIĞINI alır. Daha sonra yöntemi, sepette listelenen her ürün için ürün fiyatını ürün miktarına göre çarparak sepet toplamı alır.

Note

Yukarıdaki kod null yapılabilir "int?" türünü kullanır. Null yapılabilir türler, temel alınan bir türün tüm değerlerini ve aynı zamanda null değer olarak temsil edebilir. Daha fazla bilgi için bkz. Nullable türler kullanma.

Alışveriş sepeti görüntüsünü değiştirme

Daha sonra, GetTotal yöntemini çağırmak üzere ShoppingCart. aspx sayfasının kodunu değiştireceksiniz ve sayfa yüklendiğinde bu toplamı ShoppingCart. aspx sayfasında görüntüleyebilirsiniz.

  1. Çözüm Gezgini, ShoppingCart. aspx sayfasına sağ tıklayın ve kodu görüntüle' yi seçin.

  2. ShoppingCart.aspx.cs dosyasında, aşağıdaki kodu sarı renkle ekleyerek Page_Load işleyicisini güncelleştirin:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using WingtipToys.Models;
    using WingtipToys.Logic;
    
    namespace WingtipToys
    {
      public partial class ShoppingCart : System.Web.UI.Page
      {
        protected void Page_Load(object sender, EventArgs e)
        {
          using (ShoppingCartActions usersShoppingCart = new ShoppingCartActions())
          {
            decimal cartTotal = 0;
            cartTotal = usersShoppingCart.GetTotal();
            if (cartTotal > 0)
            {
              // Display Total.
              lblTotal.Text = String.Format("{0:c}", cartTotal);
            }
            else
            {
              LabelTotalText.Text = "";
              lblTotal.Text = "";
              ShoppingCartTitle.InnerText = "Shopping Cart is Empty";
            }
          }
        }
    
        public List<CartItem> GetShoppingCartItems()
        {
          ShoppingCartActions actions = new ShoppingCartActions();
          return actions.GetCartItems();
        }
      }
    }
    

ShoppingCart. aspx sayfası yüklendiğinde, alışveriş sepeti nesnesini yükler ve ardından ShoppingCart sınıfının GetTotal yöntemini çağırarak alışveriş sepeti toplamı alınır. Alışveriş sepeti boşsa, bu etkiye yönelik bir ileti görüntülenir.

Alışveriş sepetini toplam test etme

Yalnızca bir ürünü alışveriş sepetine nasıl ekleyekullanabileceğinizi görmek için uygulamayı şimdi çalıştırın, ancak alışveriş sepetini toplam ' u görebilirsiniz.

  1. Uygulamayı çalıştırmak için F5'e basın.
    Tarayıcı açılır ve default. aspx sayfasını gösterir.

  2. Kategori gezinti menüsünde otomobiller ' i seçin.

  3. İlk ürünün yanındaki sepet Ekle bağlantısına tıklayın.
    ShoppingCart. aspx sayfası, sipariş toplamla birlikte görüntülenir.

    Alışveriş sepeti-sepet toplamı

  4. Sepetin bazı ürünlerini (örneğin, bir düzlemi) ekleyin.

  5. ShoppingCart. aspx sayfası, eklediğiniz tüm ürünlerin güncelleştirilmiş toplamı ile görüntülenir.

    Alışveriş sepeti-birden çok ürün

  6. Tarayıcı penceresini kapatarak çalışan uygulamayı durdurun.

Alışveriş sepetine güncelleştirme ve kullanıma alma düğmeleri ekleme

Kullanıcıların alışveriş sepetini değiştirmesine izin vermek için, alışveriş sepeti sayfasına bir güncelleştirme düğmesi ve bir kullanıma alma düğmesi ekleyeceksiniz. Bu öğretici serisinde daha sonra kullanıma alma düğmesi kullanılmaz.

  1. Çözüm Gezgini' de, Web uygulaması projesinin kökündeki ShoppingCart. aspx sayfasını açın.

  2. Güncelleştirme düğmesini ve kullanıma al düğmesini ShoppingCart. aspx sayfasına eklemek için, aşağıdaki kodda gösterildiği gibi, sarı renkle vurgulanmış biçimlendirmeyi varolan biçimlendirmeye ekleyin:

    <%@ Page Title="" Language="C#" MasterPageFile="~/Site.Master" AutoEventWireup="true" CodeBehind="ShoppingCart.aspx.cs" Inherits="WingtipToys.ShoppingCart" %>
    <asp:Content ID="Content1" ContentPlaceHolderID="MainContent" runat="server">
        <div id="ShoppingCartTitle" runat="server" class="ContentHead"><h1>Shopping Cart</h1></div>
        <asp:GridView ID="CartList" runat="server" AutoGenerateColumns="False" ShowFooter="True" GridLines="Vertical" CellPadding="4"
            ItemType="WingtipToys.Models.CartItem" SelectMethod="GetShoppingCartItems"  
            CssClass="table table-striped table-bordered" >   
            <Columns>
            <asp:BoundField DataField="ProductID" HeaderText="ID" SortExpression="ProductID" />        
            <asp:BoundField DataField="Product.ProductName" HeaderText="Name" />        
            <asp:BoundField DataField="Product.UnitPrice" HeaderText="Price (each)" DataFormatString="{0:c}"/>     
            <asp:TemplateField   HeaderText="Quantity">            
                    <ItemTemplate>
                        <asp:TextBox ID="PurchaseQuantity" Width="40" runat="server" Text="<%#: Item.Quantity %>"></asp:TextBox> 
                    </ItemTemplate>        
            </asp:TemplateField>    
            <asp:TemplateField HeaderText="Item Total">            
                    <ItemTemplate>
                        <%#: String.Format("{0:c}", ((Convert.ToDouble(Item.Quantity)) *  Convert.ToDouble(Item.Product.UnitPrice)))%>
                    </ItemTemplate>        
            </asp:TemplateField> 
            <asp:TemplateField HeaderText="Remove Item">            
                    <ItemTemplate>
                        <asp:CheckBox id="Remove" runat="server"></asp:CheckBox>
                    </ItemTemplate>        
            </asp:TemplateField>    
            </Columns>    
        </asp:GridView>
        <div>
            <p></p>
            <strong>
                <asp:Label ID="LabelTotalText" runat="server" Text="Order Total: "></asp:Label>
                <asp:Label ID="lblTotal" runat="server" EnableViewState="false"></asp:Label>
            </strong> 
        </div>
      <br />
        <table> 
        <tr>
          <td>
            <asp:Button ID="UpdateBtn" runat="server" Text="Update" OnClick="UpdateBtn_Click" />
          </td>
          <td>
            <!--Checkout Placeholder -->
          </td>
        </tr>
        </table>
    </asp:Content>
    

Kullanıcı Update düğmesine tıkladığında UpdateBtn_Click olay işleyicisi çağrılır. Bu olay işleyicisi, bir sonraki adımda ekleyeceğiniz kodu çağırır.

Daha sonra, ShoppingCart.aspx.cs dosyasında yer alan kodu, sepet öğeleri aracılığıyla döngü yapmak ve RemoveItem ve UpdateItem yöntemlerini çağırmak için güncelleştirebilirsiniz.

  1. Çözüm Gezgini, Web uygulaması projesinin kökündeki ShoppingCart.aspx.cs dosyasını açın.

  2. Sarı ' de vurgulanan aşağıdaki kod bölümlerini ShoppingCart.aspx.cs dosyasına ekleyin:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using WingtipToys.Models;
    using WingtipToys.Logic;
    using System.Collections.Specialized;
    using System.Collections;
    using System.Web.ModelBinding;
    
    namespace WingtipToys
    {
      public partial class ShoppingCart : System.Web.UI.Page
      {
        protected void Page_Load(object sender, EventArgs e)
        {
          using (ShoppingCartActions usersShoppingCart = new ShoppingCartActions())
          {
            decimal cartTotal = 0;
            cartTotal = usersShoppingCart.GetTotal();
            if (cartTotal > 0)
            {
              // Display Total.
              lblTotal.Text = String.Format("{0:c}", cartTotal);
            }
            else
            {
              LabelTotalText.Text = "";
              lblTotal.Text = "";
              ShoppingCartTitle.InnerText = "Shopping Cart is Empty";
              UpdateBtn.Visible = false;
            }
          }
        }
    
        public List<CartItem> GetShoppingCartItems()
        {
          ShoppingCartActions actions = new ShoppingCartActions();
          return actions.GetCartItems();
        }
    
        public List<CartItem> UpdateCartItems()
        {
          using (ShoppingCartActions usersShoppingCart = new ShoppingCartActions())
          {
            String cartId = usersShoppingCart.GetCartId();
    
            ShoppingCartActions.ShoppingCartUpdates[] cartUpdates = new ShoppingCartActions.ShoppingCartUpdates[CartList.Rows.Count];
            for (int i = 0; i < CartList.Rows.Count; i++)
            {
              IOrderedDictionary rowValues = new OrderedDictionary();
              rowValues = GetValues(CartList.Rows[i]);
              cartUpdates[i].ProductId = Convert.ToInt32(rowValues["ProductID"]);
    
              CheckBox cbRemove = new CheckBox();
              cbRemove = (CheckBox)CartList.Rows[i].FindControl("Remove");
              cartUpdates[i].RemoveItem = cbRemove.Checked;
    
              TextBox quantityTextBox = new TextBox();
              quantityTextBox = (TextBox)CartList.Rows[i].FindControl("PurchaseQuantity");
              cartUpdates[i].PurchaseQuantity = Convert.ToInt16(quantityTextBox.Text.ToString());
            }
            usersShoppingCart.UpdateShoppingCartDatabase(cartId, cartUpdates);
            CartList.DataBind();
            lblTotal.Text = String.Format("{0:c}", usersShoppingCart.GetTotal());
            return usersShoppingCart.GetCartItems();
          }
        }
    
        public static IOrderedDictionary GetValues(GridViewRow row)
        {
          IOrderedDictionary values = new OrderedDictionary();
          foreach (DataControlFieldCell cell in row.Cells)
          {
            if (cell.Visible)
            {
              // Extract values from the cell.
              cell.ContainingField.ExtractValuesFromCell(values, cell, row.RowState, true);
            }
          }
          return values;
        }
    
        protected void UpdateBtn_Click(object sender, EventArgs e)
        {
          UpdateCartItems();
        }
      }
    }
    

Kullanıcı, ShoppingCart. aspx sayfasındaki Güncelleştir düğmesine tıkladığında updatecartıtems yöntemi çağırılır. Updatecartıtems yöntemi, alışveriş sepetindeki her öğe için güncelleştirilmiş değerleri alır. Ardından, Updatecartıtems yöntemi, alışveriş sepetinden öğe eklemek veya kaldırmak için UpdateShoppingCartDatabase yöntemini (sonraki adımda eklenen ve açıklanacak) çağırır. Veritabanı, alışveriş sepetindeki güncelleştirmeleri yansıtacak şekilde güncelleştirildikten sonra , GridView içinDataBind yöntemi çağırarak, alışveriş sepeti sayfasında GridView denetimi güncellenir. Ayrıca, alışveriş sepeti sayfasındaki toplam sipariş miktarı, güncelleştirilmiş öğe listesini yansıtacak şekilde güncelleştirilir.

Alışveriş sepeti öğelerini güncelleştirme ve kaldırma

ShoppingCart. aspx sayfasında, bir öğenin miktarını güncelleştirmek ve bir öğeyi kaldırmak için denetimlerin eklendiğini görebilirsiniz. Şimdi bu denetimlerin çalışmasını sağlayacak kodu ekleyin.

  1. Çözüm Gezgini' de, ShoppingCartActions.cs dosyasını Logic klasöründe açın.

  2. Sarı ' de vurgulanan aşağıdaki kodu ShoppingCartActions.cs sınıf dosyasına ekleyin:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using WingtipToys.Models;
    
    namespace WingtipToys.Logic
    {
      public class ShoppingCartActions : IDisposable
      {
        public string ShoppingCartId { get; set; }
    
        private ProductContext _db = new ProductContext();
    
        public const string CartSessionKey = "CartId";
    
        public void AddToCart(int id)
        {
          // Retrieve the product from the database.           
          ShoppingCartId = GetCartId();
    
          var cartItem = _db.ShoppingCartItems.SingleOrDefault(
              c => c.CartId == ShoppingCartId
              && c.ProductId == id);
          if (cartItem == null)
          {
            // Create a new cart item if no cart item exists.                 
            cartItem = new CartItem
            {
              ItemId = Guid.NewGuid().ToString(),
              ProductId = id,
              CartId = ShoppingCartId,
              Product = _db.Products.SingleOrDefault(
               p => p.ProductID == id),
              Quantity = 1,
              DateCreated = DateTime.Now
            };
    
            _db.ShoppingCartItems.Add(cartItem);
          }
          else
          {
            // If the item does exist in the cart,                  
            // then add one to the quantity.                 
            cartItem.Quantity++;
          }
          _db.SaveChanges();
        }
    
        public void Dispose()
        {
          if (_db != null)
          {
            _db.Dispose();
            _db = null;
          }
        }
    
        public string GetCartId()
        {
          if (HttpContext.Current.Session[CartSessionKey] == null)
          {
            if (!string.IsNullOrWhiteSpace(HttpContext.Current.User.Identity.Name))
            {
              HttpContext.Current.Session[CartSessionKey] = HttpContext.Current.User.Identity.Name;
            }
            else
            {
              // Generate a new random GUID using System.Guid class.     
              Guid tempCartId = Guid.NewGuid();
              HttpContext.Current.Session[CartSessionKey] = tempCartId.ToString();
            }
          }
          return HttpContext.Current.Session[CartSessionKey].ToString();
        }
    
        public List<CartItem> GetCartItems()
        {
          ShoppingCartId = GetCartId();
    
          return _db.ShoppingCartItems.Where(
              c => c.CartId == ShoppingCartId).ToList();
        }
    
        public decimal GetTotal()
        {
          ShoppingCartId = GetCartId();
          // Multiply product price by quantity of that product to get        
          // the current price for each of those products in the cart.  
          // Sum all product price totals to get the cart total.   
          decimal? total = decimal.Zero;
          total = (decimal?)(from cartItems in _db.ShoppingCartItems
                             where cartItems.CartId == ShoppingCartId
                             select (int?)cartItems.Quantity *
                             cartItems.Product.UnitPrice).Sum();
          return total ?? decimal.Zero;
        }
    
        public ShoppingCartActions GetCart(HttpContext context)
        {
          using (var cart = new ShoppingCartActions())
          {
            cart.ShoppingCartId = cart.GetCartId();
            return cart;
          }
        }
    
        public void UpdateShoppingCartDatabase(String cartId, ShoppingCartUpdates[] CartItemUpdates)
        {
          using (var db = new WingtipToys.Models.ProductContext())
          {
            try
            {
              int CartItemCount = CartItemUpdates.Count();
              List<CartItem> myCart = GetCartItems();
              foreach (var cartItem in myCart)
              {
                // Iterate through all rows within shopping cart list
                for (int i = 0; i < CartItemCount; i++)
                {
                  if (cartItem.Product.ProductID == CartItemUpdates[i].ProductId)
                  {
                    if (CartItemUpdates[i].PurchaseQuantity < 1 || CartItemUpdates[i].RemoveItem == true)
                    {
                      RemoveItem(cartId, cartItem.ProductId);
                    }
                    else
                    {
                      UpdateItem(cartId, cartItem.ProductId, CartItemUpdates[i].PurchaseQuantity);
                    }
                  }
                }
              }
            }
            catch (Exception exp)
            {
              throw new Exception("ERROR: Unable to Update Cart Database - " + exp.Message.ToString(), exp);
            }
          }
        }
    
        public void RemoveItem(string removeCartID, int removeProductID)
        {
          using (var _db = new WingtipToys.Models.ProductContext())
          {
            try
            {
              var myItem = (from c in _db.ShoppingCartItems where c.CartId == removeCartID && c.Product.ProductID == removeProductID select c).FirstOrDefault();
              if (myItem != null)
              {
                // Remove Item.
                _db.ShoppingCartItems.Remove(myItem);
                _db.SaveChanges();
              }
            }
            catch (Exception exp)
            {
              throw new Exception("ERROR: Unable to Remove Cart Item - " + exp.Message.ToString(), exp);
            }
          }
        }
    
        public void UpdateItem(string updateCartID, int updateProductID, int quantity)
        {
          using (var _db = new WingtipToys.Models.ProductContext())
          {
            try
            {
              var myItem = (from c in _db.ShoppingCartItems where c.CartId == updateCartID && c.Product.ProductID == updateProductID select c).FirstOrDefault();
              if (myItem != null)
              {
                myItem.Quantity = quantity;
                _db.SaveChanges();
              }
            }
            catch (Exception exp)
            {
              throw new Exception("ERROR: Unable to Update Cart Item - " + exp.Message.ToString(), exp);
            }
          }
        }
    
        public void EmptyCart()
        {
          ShoppingCartId = GetCartId();
          var cartItems = _db.ShoppingCartItems.Where(
              c => c.CartId == ShoppingCartId);
          foreach (var cartItem in cartItems)
          {
            _db.ShoppingCartItems.Remove(cartItem);
          }
          // Save changes.             
          _db.SaveChanges();
        }
    
        public int GetCount()
        {
          ShoppingCartId = GetCartId();
    
          // Get the count of each item in the cart and sum them up          
          int? count = (from cartItems in _db.ShoppingCartItems
                        where cartItems.CartId == ShoppingCartId
                        select (int?)cartItems.Quantity).Sum();
          // Return 0 if all entries are null         
          return count ?? 0;
        }
    
        public struct ShoppingCartUpdates
        {
          public int ProductId;
          public int PurchaseQuantity;
          public bool RemoveItem;
        }
      }
    }
    

ShoppingCart.aspx.cs sayfasındaki UpdateCartItems yönteminden çağrılan UpdateShoppingCartDatabase yöntemi, alışveriş sepetinden öğe güncelleştirme ya da kaldırma mantığını içerir. UpdateShoppingCartDatabase yöntemi, alışveriş sepeti listesinin içindeki tüm satırlarda yinelenir. Bir alışveriş sepeti öğesi kaldırılmak üzere işaretlenmişse veya miktar bir değerden küçükse RemoveItem yöntemi çağrılır. Aksi halde, UpdateItem yöntemi çağrıldığında, alışveriş sepeti öğesi güncelleştirmeler için denetlenir. Alışveriş sepeti öğesi kaldırıldıktan veya güncelleştirildikten sonra, veritabanı değişiklikleri kaydedilir.

ShoppingCartUpdates yapısı, tüm alışveriş sepeti öğelerini tutmak için kullanılır. UpdateShoppingCartDatabase yöntemi, herhangi bir öğenin güncelleştirilmesini veya kaldırılmasını öğrenmek için ShoppingCartUpdates yapısını kullanır.

Sonraki öğreticide, ürünleri satın aldıktan sonra alışveriş sepetini temizlemek için EmptyCart yöntemini kullanacaksınız. Ancak şimdilik, alışveriş sepetindeki öğelerin sayısını öğrenmek için ShoppingCartActions.cs dosyasına eklediğiniz GetCount yöntemini kullanacaksınız.

Alışveriş sepeti sayacı ekleme

Kullanıcının alışveriş sepetindeki toplam öğe sayısını görüntülemesine izin vermek için, site. Master sayfasına bir sayaç ekleyeceksiniz. Bu sayaç, alışveriş sepetine bir bağlantı görevi görür.

  1. Çözüm Gezgini, site. Master sayfasını açın.

  2. Aşağıdaki gibi görünmesi için, kılavuz ' de gösterildiği gibi alışveriş sepeti sayacı bağlantısını, gezinti bölümüne ekleyerek biçimlendirmeyi değiştirin:

    <ul class="nav navbar-nav">
          <li><a runat="server" href="~/">Home</a></li>
          <li><a runat="server" href="~/About">About</a></li>
          <li><a runat="server" href="~/Contact">Contact</a></li>
          <li><a runat="server" href="~/ProductList">Products</a></li>
          <li><a runat="server" href="~/ShoppingCart" ID="cartCount">&nbsp;</a></li>
      </ul>
    
  3. Daha sonra, site.Master.cs dosyasının arka plan kodunu, sarıya vurgulanmış kodu aşağıdaki gibi ekleyerek güncelleştirin:

    using System;
    using System.Collections.Generic;
    using System.Security.Claims;
    using System.Security.Principal;
    using System.Web;
    using System.Web.Security;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Linq;
    using WingtipToys.Models;
    using WingtipToys.Logic;
    
    namespace WingtipToys
    {
        public partial class SiteMaster : MasterPage
        {
            private const string AntiXsrfTokenKey = "__AntiXsrfToken";
            private const string AntiXsrfUserNameKey = "__AntiXsrfUserName";
            private string _antiXsrfTokenValue;
    
            protected void Page_Init(object sender, EventArgs e)
            {
                // The code below helps to protect against XSRF attacks
                var requestCookie = Request.Cookies[AntiXsrfTokenKey];
                Guid requestCookieGuidValue;
                if (requestCookie != null && Guid.TryParse(requestCookie.Value, out requestCookieGuidValue))
                {
                    // Use the Anti-XSRF token from the cookie
                    _antiXsrfTokenValue = requestCookie.Value;
                    Page.ViewStateUserKey = _antiXsrfTokenValue;
                }
                else
                {
                    // Generate a new Anti-XSRF token and save to the cookie
                    _antiXsrfTokenValue = Guid.NewGuid().ToString("N");
                    Page.ViewStateUserKey = _antiXsrfTokenValue;
    
                    var responseCookie = new HttpCookie(AntiXsrfTokenKey)
                    {
                        HttpOnly = true,
                        Value = _antiXsrfTokenValue
                    };
                    if (FormsAuthentication.RequireSSL && Request.IsSecureConnection)
                    {
                        responseCookie.Secure = true;
                    }
                    Response.Cookies.Set(responseCookie);
                }
    
                Page.PreLoad += master_Page_PreLoad;
            }
    
            protected void master_Page_PreLoad(object sender, EventArgs e)
            {
                if (!IsPostBack)
                {
                    // Set Anti-XSRF token
                    ViewState[AntiXsrfTokenKey] = Page.ViewStateUserKey;
                    ViewState[AntiXsrfUserNameKey] = Context.User.Identity.Name ?? String.Empty;
                }
                else
                {
                    // Validate the Anti-XSRF token
                    if ((string)ViewState[AntiXsrfTokenKey] != _antiXsrfTokenValue
                        || (string)ViewState[AntiXsrfUserNameKey] != (Context.User.Identity.Name ?? String.Empty))
                    {
                        throw new InvalidOperationException("Validation of Anti-XSRF token failed.");
                    }
                }
            }
    
            protected void Page_Load(object sender, EventArgs e)
            {
    
            }
    
            protected void Page_PreRender(object sender, EventArgs e)
            {
              using (ShoppingCartActions usersShoppingCart = new ShoppingCartActions())
              {
                string cartStr = string.Format("Cart ({0})", usersShoppingCart.GetCount());
                cartCount.InnerText = cartStr;
              }
            }
    
            public IQueryable<Category> GetCategories()
            {
              var _db = new WingtipToys.Models.ProductContext();
              IQueryable<Category> query = _db.Categories;
              return query;
            }
    
            protected void Unnamed_LoggingOut(object sender, LoginCancelEventArgs e)
            {
                Context.GetOwinContext().Authentication.SignOut();
            }
        }
    }
    

Sayfa HTML olarak işlenmeden önce Page_PreRender olayı tetiklenir. Page_PreRender işleyicisinde, alışveriş sepetinin toplam sayısı GetCount yöntemi çağırarak belirlenir. Döndürülen değer, site. Master sayfasının biçimlendirmesine dahil edilen cartCount aralığına eklenir. <span> Etiketler, iç öğelerin düzgün şekilde işlenmesini sağlar. Sitenin herhangi bir sayfası görüntülendiğinde, alışveriş sepeti toplamı görüntülenir. Kullanıcı alışveriş sepetini göstermek için satın alma sepet toplamı ' na de tıklayabilirsiniz.

Tamamlanmış alışveriş sepetini test etme

Alışveriş sepetindeki öğeleri nasıl ekleyebileceğiniz, silebildiğini ve güncelleştirecağınızı görmek için uygulamayı şimdi çalıştırabilirsiniz. Alışveriş sepeti toplamı, alışveriş sepetindeki tüm öğelerin toplam maliyetini yansıtır.

  1. Uygulamayı çalıştırmak için F5'e basın.
    Tarayıcı açılır ve default. aspx sayfasını gösterir.

  2. Kategori gezinti menüsünde otomobiller ' i seçin.

  3. İlk ürünün yanındaki sepet Ekle bağlantısına tıklayın.
    ShoppingCart. aspx sayfası, sipariş toplamla birlikte görüntülenir.

  4. Kategori gezinti menüsünden düzlemler ' i seçin.

  5. İlk ürünün yanındaki sepet Ekle bağlantısına tıklayın.

  6. Alışveriş sepetindeki ilk öğenin miktarını 3 ' e ayarlayın ve ikinci öğenin öğesini kaldır onay kutusunu seçin.

  7. Alışveriş sepeti sayfasını güncelleştirmek ve yeni sipariş toplamını göstermek için Güncelleştir düğmesine tıklayın.

    Alışveriş sepeti-sepet güncelleştirmesi

Özet

Bu öğreticide, Wingtip Toys Web Forms örnek uygulaması için bir alışveriş sepeti oluşturdunuz. Bu öğreticide, Entity Framework Code First, veri ek açıklamaları, türü kesin belirlenmiş veri denetimleri ve model bağlamayı kullandınız.

Alışveriş sepeti, kullanıcının satın alma için seçtiği öğelerin eklenmesini, silinmesini ve güncelleştirilmesini destekler. Alışveriş sepeti işlevinin uygulanmasının yanı sıra, bir GridView denetimindeki alışveriş sepeti öğelerini görüntülemeyi ve sipariş toplamını hesaplamayı öğrenmiş olursunuz.

Açıklanan işlevselliğin gerçek bir iş uygulamasında nasıl çalıştığını anlamak için, nopCommerce -ASP.NET tabanlı açık kaynaklı eCommerce alışveriş sepetinin örneğini görüntüleyebilirsiniz. İlk olarak, Web Forms oluşturulmuştur ve bu yıllar üzerinde, MVC 'ye taşındığını ve şimdi ASP.NET Core.

Ek bilgi

ASP.NET Oturum Durumuna Genel Bakış