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

Эрик Рейтан

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

В этой серии учебников вы узнаете, как создавать приложение веб-форм ASP.NET с помощью ASP.NET 4.5 и Microsoft Visual Studio Express 2013 для Интернета. Проект Visual Studio 2013 с исходным кодом C# доступен для сопровождения этой серии учебников.

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

Чему вы научитесь:

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

Функции кода в этом руководстве:

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

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

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

Замечание

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

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

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

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

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

  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 класса, необходимо обновить класс контекста базы данных, который управляет классами сущностей и предоставляет доступ к данным к базе данных. Для этого вы добавите класс модели CartItem в класс ProductContext.

  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) и класс корзины для покупок будет использоваться вместе для доступа к данным корзины. Страница корзины покупок отобразит все элементы, которые пользователь добавляет в корзину. Помимо страницы корзины и класса, вы создадите страницу (AddToCart.aspx), чтобы добавить продукты в корзину покупок. Вы также добавите код на страницу ProductList.aspx и страницу ProductDetails.aspx , которая предоставит ссылку на страницу AddToCart.aspx , чтобы пользователь смог добавить продукты в корзину покупок.

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

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

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

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

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

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

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

  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 Корзина используется для отслеживания элементов, которые пользователь имеет в корзине покупок. Если у пользователя нет существующей корзины, для них создается новая корзинаIDID. Если пользователь вошел в систему как зарегистрированный пользователь, корзина ID будет присвоена имени пользователя. Однако если пользователь не вошел в систему, корзина ID имеет уникальное значение (GUID). GUID гарантирует, что для каждого пользователя создается только одна корзина на основе сеанса.

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

Создание функции добавления в корзину

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

Замечание

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

Чтобы создать функционал добавления в корзину, выполните следующие шаги.

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

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

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

  3. В обозревателе решений щелкните правой кнопкой мыши страницу AddToCart.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");
        }
      }
    }
    

При загрузке страницы AddToCart.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 становится доступным в разметке элемента управления, и элемент управления приобретаeт строго типизированный характер. Как упоминалось ранее в этом руководстве, можно выбрать сведения об объекте Item с помощью IntelliSense. Чтобы настроить элемент управления данными для использования привязки модели для выбора данных, задайте SelectMethod свойство элемента управления. В разметке выше вы установили SelectMethod для использования метода GetShoppingCartItems, который возвращает список объектов 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 или страницы ProductDetails.aspx пользователь сможет добавить продукт в корзину покупок с помощью ссылки. Щелкнув ссылку, приложение переходит на страницу обработки с именем AddToCart.aspx. Страница AddToCart.aspx вызовет AddToCart метод в ShoppingCart классе, добавленном ранее в этом руководстве.

Теперь вы добавите ссылку "Добавить в корзину" на страницу ProductList.aspx и страницу ProductDetails.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 в папке логики .

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

Замечание

Приведенный выше код использует тип nullable "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 , чтобы выполнить цикл по элементам корзины и вызвать RemoveItemUpdateItem методы.

  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 , вызывается метод UpdateCartItems. Метод UpdateCartItems получает обновленные значения для каждого элемента в корзине покупок. Затем метод UpdateCartItems вызывает UpdateShoppingCartDatabase метод (добавлен и объяснен на следующем шаге), чтобы добавить или удалить элементы из корзины покупок. После обновления базы данных, чтобы отразить обновления корзины покупок, элемент управления GridView обновляется на странице корзины покупок путем вызова DataBind метода GridView. Кроме того, общая сумма заказа на странице корзины покупок обновляется, чтобы отразить обновленный список элементов.

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

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

  1. В обозревателе решений откройте файл ShoppingCartActions.cs в папке логики .

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

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

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

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

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

  3. Щелкните ссылку "Добавить в корзину" рядом с первым продуктом.
    Страница ShoppingCart.aspx отображается с общим числом заказов.

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

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

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

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

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

Сводка

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

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

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

Сведения о добавлении

Обзор состояния сеанса ASP.NET