Корзина для покупок

по Эрик Реитан

Скачайте образец проекта Wingtip Toys (C#) или Загрузите электронную книгу (PDF)

В этой серии руководств вы узнаете об основах создания приложения ASP.NET Web Forms с помощью ASP.NET 4,5 и Microsoft Visual Studio Express 2013 для Web. Для этой серии руководств доступен проект Visual Studio 2013 с C# исходным кодом .

В этом учебнике описывается бизнес-логика, необходимая для добавления корзины для покупок в приложение веб-форм Wingtip Toys с примером ASP.NET. Это руководство построено на предыдущем учебном курсе "Отображение элементов данных и сведений" и является частью руководства по магазину Wingtip Toy Store. По завершении работы с этим руководством пользователи вашего примера приложения смогут добавлять, удалять и изменять продукты в своей корзине для покупок.

Из этого руководства вы узнаете, как выполнять такие задачи:

  1. Создание корзины для веб-приложения.
  2. Как разрешить пользователям добавлять элементы в корзину для покупок.
  3. Добавление элемента управления GridView для отображения сведений о корзине для покупок.
  4. Как вычислить и отобразить итоги заказа.
  5. Удаление и обновление элементов в корзине для покупок.
  6. Включение счетчика корзины для покупок.

Возможности кода в этом учебнике:

  1. Entity Framework Code First
  2. Заметки к данным
  3. Строго типизированные элементы управления данными
  4. Привязка модели

Создание корзины для покупок

Ранее в этой серии руководств были добавлены страницы и код для просмотра данных о продуктах из базы данных. В этом учебнике вы создадите покупательскую корзину для управления продуктами, которые пользователи заинтересованы в покупке. Пользователи смогут просматривать и добавлять элементы в корзину покупок, даже если они не зарегистрированы или не вошли в систему. Чтобы управлять доступом к корзине для покупок, вы назначаете пользователям уникальный ID с помощью глобального уникального идентификатора (GUID), когда пользователь впервые обращается к корзине для покупок. Вы храните этот ID с помощью состояния сеанса ASP.NET.

Note

Состояние сеанса ASP.NET — это удобное место для хранения сведений, относящихся к пользователю, срок действия которых истекает после выхода пользователя из сайта. В то время как неправильное использование состояния сеанса может негативно сказаться на производительности на больших сайтах, в демонстрационных целях вполне удобно использовать состояние сеанса. В примере проекта Wingtip Toys показано, как использовать состояние сеанса без внешнего поставщика, где состояние сеанса хранится в процессе на веб-сервере, где размещается сайт. Для больших сайтов, которые предоставляют несколько экземпляров приложения или для сайтов, на которых запущено несколько экземпляров приложения на разных серверах, рассмотрите возможность использования службы кэша Windows Azure. Эта служба кэша предоставляет распределенную службу кэширования, которая является внешней по отношению к веб-сайту, и решает проблему использования внутрипроцессного состояния сеанса. Дополнительные сведения см. в разделе Использование состояния сеанса ASP.NET с веб-сайтами Windows Azure.

Добавление Картитем в качестве класса модели

Ранее в этой серии руководств вы определили схему для данных категории и продукта, создав классы Category и Product в папке Models . Теперь добавьте новый класс, чтобы определить схему для корзины для покупок. Далее в этом руководстве вы добавите класс для управления доступом к данным в CartItem таблице. Этот класс предоставит бизнес-логику для добавления, удаления и обновления элементов в корзине для покупок.

  1. Щелкните правой кнопкой мыши папку Models и выберите Добавить -> новый элемент.

    Корзина для покупок — новый элемент

  2. Откроется диалоговое окно Добавление нового элемента . Выберите код, а затем выберите класс.

    Корзина для покупок — диалоговое окно "Добавление нового элемента"

  3. Назовите этот новый класс CartItem.CS.

  4. Нажмите кнопку Добавить.
    В редакторе отобразится новый файл класса.

  5. Замените код по умолчанию на приведенный ниже:

    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 содержит схему, которая будет определять каждый продукт, добавляемый пользователем в корзину для покупок. Этот класс похож на другие классы схем, созданные ранее в этой серии руководств. По соглашению Entity Framework Code First ожидает, что первичный ключ для CartItem таблицы будет либо CartItemId, либо ID. Однако код переопределяет поведение по умолчанию с помощью атрибута [Key] аннотации данных. Атрибут Key свойства ItemId указывает, что свойство ItemID является первичным ключом.

Свойство CartId указывает ID пользователя, связанного с приобретаемым элементом. Вы добавите код для создания этого пользователя ID, когда пользователь попытается получить доступ к корзине для покупок. Этот ID также будет храниться как переменная сеанса ASP.NET.

Обновление контекста продукта

Помимо добавления класса CartItem необходимо обновить класс контекста базы данных, управляющий классами сущностей и предоставляющий доступ к базе данных. Для этого в класс ProductContext будет добавлен созданный класс модели CartItem.

  1. В Обозреватель решенийнайдите и откройте файл ProductContext.CS в папке Models .

  2. Добавьте выделенный код в файл ProductContext.CS следующим образом:

    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; }
        }
    }
    

Как упоминалось ранее в этой серии руководств, код в файле ProductContext.CS добавляет пространство имен System.Data.Entity, чтобы получить доступ ко всем основным функциональным возможностям Entity Framework. Эта функция включает в себя возможность запрашивать, вставлять, обновлять и удалять данные, работая со строго типизированными объектами. Класс ProductContext добавляет доступ к только что добавленному классу модели CartItem.

Управление бизнес-логикой покупательской корзины

Далее предстоит создать класс ShoppingCart в новой папке логики . Класс ShoppingCart обрабатывает доступ к данным CartItem таблице. Класс также будет включать бизнес-логику для добавления, удаления и обновления элементов в корзине для покупок.

Логика корзины для покупок, которую вы добавите, будет содержать функции для управления следующими действиями:

  1. Добавление элементов в корзину для покупок
  2. Удаление элементов из корзины для покупок
  3. Получение идентификатора корзины для покупок
  4. Получение элементов из корзины для покупок
  5. Суммарный объем всех элементов корзины для покупок
  6. Обновление данных корзины для покупок

Для доступа к данным корзины можно использовать страницу покупательской корзины (ShoppingCart. aspx) и класс корзины для покупок. На странице Корзина для покупок отобразятся все элементы, добавленные пользователем в корзину для покупок. Помимо страницы и класса покупательской корзины Вы создадите страницу (аддтокарт. aspx) для добавления продуктов в корзину для покупок. Вы также добавите код на страницу ProductList. aspx и страницу продуктдетаилс. aspx , которая предоставит ссылку на страницу аддтокарт. aspx , чтобы пользователь мог добавлять продукты в корзину для покупок.

На следующей схеме показан базовый процесс, который происходит, когда пользователь добавляет продукт в корзину для покупок.

Покупательская корзина — Добавление в корзину для покупок

Когда пользователь щелкает ссылку Добавить в корзину на странице ProductList. aspx или продуктдетаилс. aspx , приложение будет переходить на страницу аддтокарт. aspx , а затем автоматически на страницу ShoppingCart. aspx . Страница аддтокарт. aspx добавит продукт SELECT в корзину для покупок, вызвав метод в классе ShoppingCart. На странице ShoppingCart. aspx отобразятся продукты, добавленные в корзину для покупок.

Создание класса корзины для покупок

Класс ShoppingCart будет добавлен в отдельную папку в приложении, чтобы существовало четкое различие между моделью (папкой Models), страницами (корневая папка) и логикой (логическая папка).

  1. В Обозреватель решенийщелкните правой кнопкой мыши проект WingtipToysи выберите добавить->Новая папка. Назовите новую логикупапки.

  2. Щелкните правой кнопкой мыши папку Logic и выберите Добавить -> новый элемент.

  3. Добавьте новый файл класса с именем ShoppingCartActions.CS.

  4. Замените код по умолчанию на приведенный ниже:

    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 метод позволяет включать отдельные продукты в корзину для покупок на основе IDпродукта. Продукт добавляется в корзину, или если корзина уже содержит элемент для этого продукта, количество увеличивается.

Метод GetCartId возвращает ID корзины для пользователя. Корзина ID используется для контроля элементов, которые пользователь имеет в корзине для покупок. Если у пользователя нет существующей корзины ID, для них создается новая корзина ID. Если пользователь вошел в систему как зарегистрированный пользователь, для ID корзины задается имя пользователя. Однако если пользователь не вошел в учетную запись, для ID корзины задается уникальное значение (GUID). Идентификатор GUID гарантирует, что для каждого пользователя создается только одна корзина на основе сеанса.

Метод GetCartItems возвращает список элементов корзины покупок для пользователя. Далее в этом руководстве вы увидите, что привязка модели используется для показа элементов корзины в корзине для покупок с помощью метода GetCartItems.

Создание функции "надстройка — Корзина"

Как упоминалось ранее, вы создадите страницу обработки с именем аддтокарт. aspx , которая будет использоваться для добавления новых продуктов в корзину для покупок пользователя. Эта страница будет вызывать метод AddToCart в только что созданном классе ShoppingCart. Страница аддтокарт. aspx будет предполагать, что в нее передается ID продукта. Этот ID продукта будет использоваться при вызове метода AddToCart в классе ShoppingCart.

Note

Вы будете изменять код программной части (AddToCart.aspx.CS) для этой страницы, а не пользовательский интерфейс страницы (аддтокарт. aspx).

Чтобы создать функцию "надстройка-Корзина", сделайте следующее:

  1. В Обозреватель решенийщелкните правой кнопкой мыши проект WingtipToysи выберите добавить -> новый элемент.
    Откроется диалоговое окно Добавление нового элемента .

  2. Добавьте стандартную новую страницу (веб-форму) в приложение с именем аддтокарт. aspx.

    Корзина для покупок — Добавление веб-формы

  3. В Обозреватель решенийщелкните правой кнопкой мыши страницу аддтокарт. aspx и выберите пункт Просмотреть код. Файл кода программной части AddToCart.aspx.CS открывается в редакторе.

  4. Замените существующий код в коде программной части AddToCart.aspx.CS следующим кодом:

    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");
        }
      }
    }
    

При загрузке страницы аддтокарт. aspx из строки запроса извлекается ID продукта. Затем создается экземпляр класса корзины для покупок, который используется для вызова метода AddToCart, добавленного ранее в этом руководстве. Метод AddToCart, содержащийся в файле ShoppingCartActions.CS , включает логику для добавления выбранного продукта в корзину для покупок или увеличения количества продуктов выбранного продукта. Если продукт не был добавлен в корзину для покупок, продукт добавляется в таблицу CartItem базы данных. Если продукт уже добавлен в корзину для покупок и пользователь добавляет дополнительный элемент того же продукта, количество товара увеличивается в таблице CartItem. Наконец, страница перенаправляется обратно на страницу ShoppingCart. aspx , которая будет добавлена на следующем шаге, где пользователь увидит обновленный список элементов в корзине.

Как упоминалось ранее, пользовательское ID используется для поиска продуктов, связанных с конкретным пользователем. Эта ID добавляется в строку таблицы CartItem каждый раз, когда пользователь добавляет продукт в корзину для покупок.

Создание пользовательского интерфейса корзины для покупок

На странице ShoppingCart. aspx отобразятся продукты, добавленные пользователем в корзину для покупок. Кроме того, она позволяет добавлять, удалять и обновлять элементы в корзине для покупок.

  1. В Обозреватель решенийщелкните правой кнопкой мыши WingtipToys, выберите добавить -> новый элемент.
    Откроется диалоговое окно Добавление нового элемента .

  2. Добавьте новую страницу (веб-форму), содержащую главную страницу, выбрав веб-форму с помощью главной страницы. Назовите новую страницу ShoppingCart. aspx.

  3. Выберите site. master , чтобы присоединить главную страницу к только что созданной странице . aspx .

  4. На странице ShoppingCart. aspx замените существующую разметку следующей разметкой:

    <%@ 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 включает элемент управления GridView с именем CartList. Этот элемент управления использует привязку модели для привязки данных корзины покупок из базы данных к элементу управления GridView . При задании свойства ItemType элемента управления GridView выражение привязки данных Item доступно в разметке элемента управления, а элемент управления становится строго типизированным. Как упоминалось ранее в этой серии руководств, можно выбрать сведения об объекте Item с помощью IntelliSense. Чтобы настроить элемент управления данными для использования привязки модели для выбора данных, необходимо задать свойство SelectMethod элемента управления. В приведенной выше разметке задается SelectMethod для использования метода Жетшоппингкартитемс, возвращающего список объектов CartItem. Элемент управления данными GridView вызывает метод в соответствующее время в жизненном цикле страницы и автоматически привязывает возвращенные данные. Метод GetShoppingCartItems по-прежнему должен быть добавлен.

Получение элементов корзины для покупок

Затем добавьте код в код программной части ShoppingCart.aspx.CS , чтобы получить и заполнить пользовательский интерфейс корзины для покупок.

  1. В Обозреватель решенийщелкните правой кнопкой мыши страницу ShoppingCart. aspx и выберите пункт Просмотреть код. Файл кода программной части ShoppingCart.aspx.CS открывается в редакторе.

  2. Замените существующий код следующим кодом:

    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();
        }
      }
    }
    

Как упоминалось выше, GridView элемент управления данными вызывает метод GetShoppingCartItems в соответствующее время жизненного цикла страницы и автоматически привязывает возвращенные данные. Метод GetShoppingCartItems создает экземпляр объекта ShoppingCartActions. Затем код использует этот экземпляр для возврата элементов в корзине путем вызова метода GetCartItems.

Добавление продуктов в корзину для покупок

При отображении страницы ProductList. aspx или продуктдетаилс. aspx пользователь сможет добавить продукт в корзину для покупок с помощью ссылки. При щелчке по ссылке приложение переходит на страницу обработки с именем аддтокарт. aspx. Страница аддтокарт. aspx будет вызывать метод AddToCart в классе ShoppingCart, который был добавлен ранее в этом руководстве.

Теперь вы добавите ссылку Добавить в корзину как на страницу ProductList. aspx , так и на страницу продуктдетаилс. aspx . Эта ссылка будет содержать продукт ID, полученный из базы данных.

  1. В Обозреватель решенийнайдите и откройте страницу с именем ProductList. aspx.

  2. Добавьте разметку, выделенную желтым цветом, на страницу ProductList. aspx , чтобы вся страница выявлялась следующим образом:

    <%@ 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>
    

Тестирование корзины для покупок

Запустите приложение, чтобы увидеть, как вы добавляете продукты в корзину для покупок.

  1. Нажмите клавишу F5 для запуска приложения.
    После того, как проект воссоздаст базу данных, откроется браузер и отобразится страница Default. aspx .

  2. В меню навигации по категориям выберите автомобили .
    Отобразится страница ProductList. aspx , на которой отображаются только продукты, включенные в категорию "автомобили".

    Покупательская корзина — автомобили

  3. Щелкните ссылку Добавить в корзину рядом с первым продуктом в списке (преобразованный автомобиль).
    Отобразится страница ShoppingCart. aspx , в которой отображается выбор в корзине для покупок.

    Корзина для покупок

  4. Просмотрите дополнительные продукты, выбрав плоскости в меню навигации по категории.

  5. Щелкните ссылку Добавить в корзину рядом с первым продуктом в списке.
    Отобразится страница ShoppingCart. aspx с дополнительным элементом.

  6. Закройте браузер.

Вычисление и отображение итога заказа

Помимо добавления продуктов в корзину для покупок, добавьте метод GetTotal в класс ShoppingCart и отобразите общую сумму заказа на странице покупательская корзина.

  1. В Обозреватель решенийоткройте файл ShoppingCartActions.CS в папке Logic .

  2. Добавьте следующий метод GetTotal, выделенный желтым цветом, в класс ShoppingCart, чтобы класс выявлялся следующим образом:

    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;
        }
      }
    }
    

Сначала метод GetTotal возвращает идентификатор корзины для пользователя. Затем метод возвращает сумму корзины, умножая цену продукта на количество продуктов для каждого продукта, указанного в корзине.

Note

В приведенном выше коде используется тип, допускающий значение null "int?". Типы, допускающие значение null, могут представлять все значения базового типа, а также как значение null. Дополнительные сведения см. в разделе Использование типов, допускающих значение NULL.

Изменение экрана корзины для покупок

Далее предстоит изменить код для страницы ShoppingCart. aspx , чтобы вызвать метод GetTotal и отобразить это итоговое значение на странице ShoppingCart. aspx при загрузке страницы.

  1. В Обозреватель решенийщелкните правой кнопкой мыши страницу ShoppingCart. aspx и выберите команду Просмотреть код.

  2. В файле ShoppingCart.aspx.CS обновите обработчик Page_Load, добавив следующий код, выделенный желтым цветом:

    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 загружается, она загружает объект корзины для покупок, а затем получает итоговую корзину, вызывая метод GetTotal класса ShoppingCart. Если корзина для покупок пуста, отобразится сообщение с этим действием.

Тестирование всего покупательской корзины

Запустите приложение, чтобы увидеть, как можно не только добавить продукт в корзину для покупок, но и просмотреть итоги в корзине для покупок.

  1. Нажмите клавишу F5 для запуска приложения.
    Откроется браузер и отобразится страница Default.aspx .

  2. В меню навигации по категориям выберите автомобили .

  3. Щелкните ссылку Добавить в корзину рядом с первым продуктом.
    Отобразится страница ShoppingCart. aspx с итоговым порядком.

    Корзина для покупок — итоговая корзина

  4. Добавьте в корзину некоторые другие продукты (например, плоскость).

  5. Отобразится страница ShoppingCart. aspx с обновленным итогом для всех добавленных продуктов.

    Корзина для покупок — несколько продуктов

  6. Закройте работающее приложение, закрыв окно браузера.

Добавление кнопок обновления и извлечения в корзину для покупок

Чтобы разрешить пользователям изменять корзину для покупок, добавьте кнопку обновления и кнопку « Извлечение » на страницу покупательской корзины. Кнопка извлечь не используется до тех пор, пока не будет приведена эта серия руководств.

  1. В Обозреватель решенийоткройте страницу ShoppingCart. aspx в корне проекта веб-приложения.

  2. Чтобы добавить кнопку " Обновить " и кнопку " извлечь " на страницу ShoppingCart. aspx , добавьте разметку, выделенную желтым цветом, в существующую разметку, как показано в следующем коде:

    <%@ 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>
    

Когда пользователь нажимает кнопку " Обновить ", будет вызван обработчик событий UpdateBtn_Click. Этот обработчик событий вызовет код, который будет добавлен на следующем шаге.

Затем можно обновить код, содержащийся в файле ShoppingCart.aspx.CS , для циклического прохода по элементам корзины и вызова методов RemoveItem и UpdateItem.

  1. В Обозреватель решенийоткройте файл ShoppingCart.aspx.CS в корне проекта веб-приложения.

  2. Добавьте в файл ShoppingCart.aspx.CS следующие разделы кода, выделенные желтым цветом:

    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();
        }
      }
    }
    

Когда пользователь нажимает кнопку Обновить на странице ShoppingCart. aspx , вызывается метод упдатекартитемс. Метод Упдатекартитемс получает обновленные значения для каждого элемента в корзине для покупок. Затем метод Упдатекартитемс вызывает метод UpdateShoppingCartDatabase (добавлен и описан на следующем шаге) для добавления или удаления элементов из корзины для покупок. После обновления базы данных для отражения обновлений в корзине для покупок элемент управления GridView обновляется на странице Корзина для покупок путем вызова метода DataBind для GridView. Кроме того, Общая сумма заказа на странице покупательской корзины обновляется, чтобы отразить обновленный список элементов.

Обновление и удаление элементов корзины для покупок

На странице ShoppingCart. aspx можно увидеть элементы управления, добавленные для обновления количества элементов и удаления элемента. Теперь добавьте код, который сделает эти элементы управления работоспособными.

  1. В Обозреватель решенийоткройте файл ShoppingCartActions.CS в папке Logic .

  2. Добавьте следующий код, выделенный желтым цветом, в файл класса ShoppingCartActions.CS :

    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;
        }
      }
    }
    

Метод UpdateShoppingCartDatabase, вызываемый из метода UpdateCartItems на странице ShoppingCart.aspx.CS , содержит логику обновления или удаления элементов из корзины для покупок. Метод UpdateShoppingCartDatabase выполняет итерацию по всем строкам в списке покупательской корзины. Если элемент корзины для покупок был помечен для удаления или количество меньше единицы, вызывается метод RemoveItem. В противном случае элемент корзины для покупок проверяется на наличие обновлений при вызове метода UpdateItem. После удаления или обновления элемента корзины для покупок изменения базы данных сохраняются.

Структура ShoppingCartUpdates используется для хранения всех элементов корзины покупок. Метод UpdateShoppingCartDatabase использует структуру ShoppingCartUpdates для определения необходимости обновления или удаления какого либо из элементов.

В следующем руководстве вы будете использовать метод EmptyCart для очистки корзины для покупок после приобретения продуктов. Но пока вы будете использовать метод GetCount, который вы только что добавили в файл ShoppingCartActions.CS , чтобы определить, сколько элементов находится в корзине для покупок.

Добавление счетчика корзины для покупок

Чтобы разрешить пользователю просматривать общее количество элементов в корзине для покупок, необходимо добавить счетчик на страницу site. master . Этот счетчик также будет действовать как ссылка на корзину для покупок.

  1. В Обозреватель решенийоткройте страницу site. master .

  2. Измените разметку, добавив ссылку счетчика корзины для покупок, как показано желтым цветом, в раздел навигации, чтобы он отображался следующим образом:

    <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. Затем обновите код программной части файла site.master.CS , добавив код, выделенный желтым цветом, следующим образом:

    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();
            }
        }
    }
    

Перед отображением страницы в формате HTML возникает событие Page_PreRender. В обработчике Page_PreRender общее число покупательской корзины определяется путем вызова метода GetCount. Возвращаемое значение добавляется к cartCountному диапазону, включенному в разметку страницы site. master . Теги <span> позволяют правильно подготавливать внутренние элементы. При отображении любой страницы сайта отобразится итоговая корзина для покупок. Пользователь также может щелкнуть итог в корзине для покупок, чтобы отобразить корзину для покупок.

Тестирование готовой корзины для покупок

Теперь можно запустить приложение, чтобы увидеть, как можно добавлять, удалять и обновлять элементы в корзине для покупок. Итоговая корзина для покупок будет отражать общую стоимость всех товаров в корзине для покупок.

  1. Нажмите клавишу F5 для запуска приложения.
    Откроется браузер и отобразится страница Default. aspx .

  2. В меню навигации по категориям выберите автомобили .

  3. Щелкните ссылку Добавить в корзину рядом с первым продуктом.
    Отобразится страница ShoppingCart. aspx с итоговым порядком.

  4. В меню навигации по категориям выберите плоскости .

  5. Щелкните ссылку Добавить в корзину рядом с первым продуктом.

  6. Задайте количество первого элемента в корзине для покупок равным 3 и установите флажок удалить элемент второго элемента.

  7. Нажмите кнопку Обновить , чтобы обновить страницу покупательской корзины и отобразить новый итог заказа.

    Корзина для покупок — обновление корзины

Сводка

В этом руководстве вы создали корзину для работы с примером приложения веб-форм Wingtip Toys. Во время работы с этим руководством вы использовали Entity Framework Code First, заметки к данным, строго типизированные элементы управления данными и привязку модели.

Покупательская корзина поддерживает добавление, удаление и обновление элементов, выбранных пользователем для покупки. Помимо реализации функции корзины для покупок вы узнали, как отображать элементы корзины для покупок в элементе управления GridView и вычислять итоги заказа.

Чтобы понять, как описанная функциональность работает в реальных бизнес-приложениях, можно просмотреть пример корзины для покупок с открытым исходным кодом на основе nopCommerce -ASP.NET. Изначально она была разработана на основе веб-форм и в течение нескольких лет, которые были перенесены в MVC и теперь ASP.NET Core.

Дополнительные сведения

Общие сведения о состоянии сеанса ASP.NET