zoukankan      html  css  js  c++  java
  • 牛腩购物网25:购物车的实现

    第二部分:购物车的实现

    我们用session来保存购物车,用一个哈希表来保存商品

    购物车


    商品1:单价,数量 商品2:单价,数量 商品3:单价,数量

    购物车中的每一个商品,都是一个对象,这个对象,有单价,和数量这2个属性,购物车是很多对象的集合。

    我们在model层中,增加一个 ShopItem 类, 这个就是表示 购物车 商品类

    还增加一个 ShopCart 类,这个就是购物车类,里面有很多对 购物车商品的方法

    ShopItem.cs

     1:  using System;
     2:  using System.Collections.Generic;
     3:  using System.Linq;
     4:  using System.Text;
     5:  
     6:  namespace Niunan.Shop.Model
     7:  {
     8:     public class ShopItem
     9:      {
    10:         //这里用到 asp.net 3.5的 自动属性
    11:  
    12:         public int proid { get; set; }       //商品ID
    13:         public decimal price { get; set; }   //商品的价格
    14:         public int quantity { set; get; }    //商品的数量
    15:  
    16:  
    17:      }
    18:  }
    19:  

    ShopCart.cs

      1:  using System;
      2:  using System.Collections.Generic;
      3:  using System.Linq;
      4:  using System.Text;
      5:  using System.Collections;// 如果我们要使用  哈希表 ,就需要引用这个集合
      6:  
      7:  namespace Niunan.Shop.Model
      8:  {
      9:      /// <summary>购物车类
     10:      /// 
     11:      /// </summary>
     12:      public class ShopCart
     13:      {
     14:          private Hashtable _sc = new Hashtable();
     15:  
     16:          /// <summary>向购物车中,添加商品
     17:          /// 
     18:          /// </summary>
     19:          /// <param name="proid">商品的ID</param>
     20:          /// <param name="item">商品</param>
     21:          public void Add(int proid, ShopItem item)
     22:          {
     23:              //先判断这个商品是否存在
     24:              if (_sc[proid] == null)
     25:              {
     26:                  //不存在
     27:                  _sc.Add(proid, item);
     28:              }
     29:              else
     30:              {
     31:                  //如果存在,我们先把商品取出来,然后给商品的数量+1
     32:  
     33:                  ShopItem si = _sc[proid] as ShopItem;   //这里的 _sc[proid]  是指根据商品ID,获取对应的值,
     34:  这个值是个object 我们需要转换为 shopitem
     35:                  si.quantity += 1;
     36:                  _sc[proid] = si;
     37:              }
     38:          }
     39:  
     40:          /// <summary>删除购物车中的商品
     41:          /// 
     42:          /// </summary>
     43:          /// <param name="proid">商品的ID</param>
     44:          public void Delete(int proid)
     45:          {
     46:              if (_sc[proid] != null)
     47:              {
     48:                  _sc.Remove(proid);
     49:              }
     50:  
     51:          }
     52:  
     53:          /// <summary>修改购物车中商品的数量
     54:          /// 
     55:          /// </summary>
     56:          /// <param name="proid">商品id</param>
     57:          /// <param name="quantity">数量</param>
     58:          public void Update(int proid, int quantity)
     59:          {
     60:              //先判断有无商品
     61:              if (_sc[proid] != null)
     62:              {
     63:                  ShopItem si = _sc[proid] as ShopItem;
     64:                  //如果数量>0 那么就直接修改数量,否则数量为0的话,就删除掉这个商品
     65:                  if (quantity > 0)
     66:                  {
     67:                      si.quantity = quantity;
     68:                  }
     69:                  else
     70:                  {
     71:                      _sc.Remove(proid);
     72:                  }
     73:  
     74:              }
     75:          }
     76:          /// <summary>获取购物车中商品的种类的数量,例如是有多少种商品
     77:          /// 
     78:          /// </summary>
     79:          /// <returns></returns>
     80:          public int GetItemCount()
     81:          {
     82:              return _sc.Count;  //返回的是  哈希table 键/值 对的数量
     83:          }
     84:  
     85:          /// <summary>返回购物车中商品的总价
     86:          /// 
     87:          /// </summary>
     88:          /// <returns></returns>
     89:          public decimal GetTotalPrice()
     90:          {
     91:              decimal total = 0;
     92:              //这里的 _sc.Value 是一个 iCollection, i 表示 Interface, 也就是表示是一个集合的接口
     93:              //如果是要绑定 gridview 或者是 repeater 等数据控件  ,必须要实现 icollection接口
     94:              foreach (ShopItem item in _sc.Values)
     95:              {
     96:                  total += item.price * item.quantity;
     97:              }
     98:              return total;
     99:          }
    100:  
    101:          /// <summary>获取购物车中商品的集合,用于绑定数据控件
    102:          /// 
    103:          /// </summary>
    104:          /// <returns></returns>
    105:          public ICollection GetItemList()
    106:          {
    107:              //这里的 _sc.Value 是一个 iCollection, i 表示 Interface, 也就是表示是一个集合的接口
    108:              //如果是要绑定 gridview 或者是 repeater 等数据控件  ,必须要实现 icollection接口
    109:              return _sc.Values;
    110:          }
    111:  
    112:      }
    113:  }
    114:  

    我们来建立一个测试页面,来测试购物车。

    前台test.aspx 代码

     1:  <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="test.aspx.cs" Inherits="Niunan.Shop.Web.test" %>
     2:  
     3:  <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
     4:  
     5:  <html xmlns="http://www.w3.org/1999/xhtml">
     6:  <head runat="server">
     7:      <title></title>
     8:  </head>
     9:  <body>
    10:      <form id="form1" runat="server">
    11:      <div>
    12:      
    13:          <asp:Button ID="Button1" runat="server" Text="添加商品1" CommandArgument="1"  OnClick="buy"/>
    14:          <asp:Button ID="Button2" runat="server" Text="添加商品2" CommandArgument="2"  OnClick="buy"/>
    15:          <asp:Button ID="Button3" runat="server" Text="添加商品3" CommandArgument="3"  OnClick="buy"/>
    16:          <asp:Button ID="Button4" runat="server" Text="添加商品4" CommandArgument="4"  OnClick="buy"/>
    17:          <asp:Button ID="Button5" runat="server" Text="添加商品5" CommandArgument="5"  OnClick="buy"/>
    18:      
    19:      </div>
    20:          <div>
    21:              购物车中商品的种类:
    22:              <asp:Literal ID="litCount" runat="server"></asp:Literal><br />
    23:  
    24:              购物车中商品的总价
    25:              <asp:Literal ID="litTotalPrice" runat="server"></asp:Literal>
    26:  
    27:              <br />
    28:              <br />
    29:              <asp:GridView ID="gdCart" runat="server">
    30:              </asp:GridView>
    31:  
    32:          </div>
    33:      </form>
    34:  </body>
    35:  </html>
    36:  

    后台代码:

     1:  using System;
     2:  using System.Collections.Generic;
     3:  using System.Linq;
     4:  using System.Web;
     5:  using System.Web.UI;
     6:  using System.Web.UI.WebControls;
     7:  
     8:  namespace Niunan.Shop.Web
     9:  {
    10:      public partial class test : System.Web.UI.Page
    11:      {
    12:          protected void Page_Load(object sender, EventArgs e)
    13:          {
    14:              if (Session["cart"]!=null)
    15:              {
    16:                  Niunan.Shop.Model.ShopCart sc = Session["cart"] as Niunan.Shop.Model.ShopCart;
    17:                  litCount.Text = sc.GetItemCount().ToString();
    18:                  litTotalPrice.Text = sc.GetTotalPrice().ToString("c2");
    19:                  gdCart.DataSource = sc.GetItemList();
    20:                  gdCart.DataBind();
    21:              }
    22:          }
    23:  
    24:          protected void buy(object sender, EventArgs e)
    25:          {
    26:              string proid = (sender as  Button).CommandArgument;
    27:  
    28:              decimal price = int.Parse(proid) * 10;
    29:  
    30:              if (Session["cart"] != null)
    31:              {
    32:                  //如果不等于空的话,我们就先取出来,然后再加进去
    33:                  Niunan.Shop.Model.ShopCart sc = Session["cart"] as Niunan.Shop.Model.ShopCart;
    34:                  sc.Add(int.Parse(proid),new Model.ShopItem{
    35:                  proid=int.Parse(proid),price=price,quantity=1
    36:                  });
    37:                  Session["cart"] = sc;
    38:  
    39:              }
    40:              else
    41:              {
    42:                  Niunan.Shop.Model.ShopCart sc = new Model.ShopCart();
    43:                  sc.Add(int.Parse(proid), new Model.ShopItem {
    44:                      proid = int.Parse(proid),
    45:                      price = price,
    46:                      quantity = 1
    47:                  });
    48:  
    49:                  //然后把购物车,放到session里面
    50:                  Session["cart"] = sc;
    51:              }
    52:  
    53:              Response.Redirect(Request.Url.ToString());
    54:              
    55:  
    56:          }
    57:      }
    58:  }

    前台的样式如下,但是,这里的girdview是我们自带的,如果我们想要修改,怎么弄呢?

    image_thumb[1]

    我们先禁用girdview的 自动显示字段, AutoGenerateColumns="false" 然后我们开始编辑列

    image_thumb[2]

    image_thumb[3]

    image_thumb[4]

    image_thumb[5]

    最后,前台代码如下:

     1:  <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="test.aspx.cs" Inherits="Niunan.Shop.Web.test" %>
     2:  
     3:  <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
     4:  <html xmlns="http://www.w3.org/1999/xhtml">
     5:  <head runat="server">
     6:      <title></title>
     7:  </head>
     8:  <body>
     9:      <form id="form1" runat="server">
    10:      <div>
    11:          <asp:Button ID="Button1" runat="server" Text="添加商品1" CommandArgument="1" OnClick="buy" />
    12:          <asp:Button ID="Button2" runat="server" Text="添加商品2" CommandArgument="2" OnClick="buy" />
    13:          <asp:Button ID="Button3" runat="server" Text="添加商品3" CommandArgument="3" OnClick="buy" />
    14:          <asp:Button ID="Button4" runat="server" Text="添加商品4" CommandArgument="4" OnClick="buy" />
    15:          <asp:Button ID="Button5" runat="server" Text="添加商品5" CommandArgument="5" OnClick="buy" />
    16:      </div>
    17:      <div>
    18:          购物车中商品的种类:
    19:          <asp:Literal ID="litCount" runat="server"></asp:Literal><br />
    20:          购物车中商品的总价
    21:          <asp:Literal ID="litTotalPrice" runat="server"></asp:Literal>
    22:          <br />
    23:          <br />
    24:          <asp:GridView ID="gdCart" runat="server" EnableModelValidation="True" AutoGenerateColumns="False">
    25:              <Columns>
    26:                  <asp:BoundField DataField="proid" HeaderText="商品ID" />
    27:                  <asp:BoundField DataField="price" HeaderText="价格" />
    28:                  <asp:TemplateField HeaderText="数量">
    29:                      <ItemTemplate>
    30:                          <asp:TextBox ID="TextBox1" runat="server" Text='<%#Eval("quantity") %>' ToolTip='<%#Eval("proid") %>' AutoPostBack="true" OnTextChanged="Mod"></asp:TextBox>
    31:                      </ItemTemplate>
    32:                  </asp:TemplateField>
    33:                  <asp:TemplateField HeaderText="小计">
    34:                      <ItemTemplate>
    35:                          <%# decimal.Parse(Eval("price").ToString()) * int.Parse(Eval("quantity").ToString()) %>
    36:                      </ItemTemplate>
    37:                  </asp:TemplateField>
    38:                  <asp:TemplateField HeaderText="操作">
    39:                      <ItemTemplate>
    40:                          <asp:LinkButton ID="LinkButton1" runat="server" OnClick="delete" CommandArgument='<%#Eval("proid") %>'>删除</asp:LinkButton>
    41:                      </ItemTemplate>
    42:                  </asp:TemplateField>
    43:              </Columns>
    44:          </asp:GridView>
    45:          <br />
    46:          <br />
    47:      </div>
    48:      </form>
    49:  </body>
    50:  </html>
    51:  

    后台代码:

      1:  using System;
      2:  using System.Collections.Generic;
      3:  using System.Linq;
      4:  using System.Web;
      5:  using System.Web.UI;
      6:  using System.Web.UI.WebControls;
      7:  
      8:  
      9:  namespace Niunan.Shop.Web
     10:  {
     11:      public partial class test : System.Web.UI.Page
     12:      {
     13:          protected void Page_Load(object sender, EventArgs e)
     14:          {
     15:              if (!Page.IsPostBack)   //回发的时候,我们会在page_load  看到页面上所有的控件的值,在回发的时候都被保存了下来,并且可以访问
     16:              {
     17:                  if (Session["cart"] != null)
     18:                  {
     19:                      Niunan.Shop.Model.ShopCart sc = Session["cart"] as Niunan.Shop.Model.ShopCart;
     20:                      litCount.Text = sc.GetItemCount().ToString();
     21:                      litTotalPrice.Text = sc.GetTotalPrice().ToString("c2");
     22:                      gdCart.DataSource = sc.GetItemList();
     23:                      gdCart.DataBind();
     24:                  }
     25:              }
     26:          }
     27:  
     28:          //购买
     29:          protected void buy(object sender, EventArgs e)
     30:          {
     31:              string proid = (sender as Button).CommandArgument;
     32:  
     33:              decimal price = int.Parse(proid) * 10;
     34:  
     35:              if (Session["cart"] != null)
     36:              {
     37:                  //如果不等于空的话,我们就先取出来,然后再加进去
     38:                  Niunan.Shop.Model.ShopCart sc = Session["cart"] as Niunan.Shop.Model.ShopCart;
     39:                  sc.Add(int.Parse(proid), new Model.ShopItem
     40:                  {
     41:                      proid = int.Parse(proid),
     42:                      price = price,
     43:                      quantity = 1
     44:                  });
     45:                  Session["cart"] = sc;
     46:  
     47:              }
     48:              else
     49:              {
     50:                  Niunan.Shop.Model.ShopCart sc = new Model.ShopCart();
     51:                  sc.Add(int.Parse(proid), new Model.ShopItem
     52:                  {
     53:                      proid = int.Parse(proid),
     54:                      price = price,
     55:                      quantity = 1
     56:                  });
     57:  
     58:                  //然后把购物车,放到session里面
     59:                  Session["cart"] = sc;
     60:              }
     61:  
     62:              Response.Redirect(Request.Url.ToString());
     63:  
     64:  
     65:          }
     66:  
     67:          //修改购物车中商品的数量
     68:          protected void Mod(object sender, EventArgs e)
     69:          {
     70:              TextBox txt = (sender as TextBox);  //这里是 TextBox 获取的方法  ,先转换为一个 TextBox 对象
     71:              string proid = txt.ToolTip;
     72:              string quantity = txt.Text;
     73:              int x;
     74:              //如果数量不能转换,我们就强制数量为1
     75:              if (!int.TryParse(quantity, out x))
     76:              {
     77:                  x = 1;
     78:              }
     79:              if (Session["cart"] != null)
     80:              {
     81:                  //如果不等于空的话,我们就先取出来,然后再加进去
     82:                  Niunan.Shop.Model.ShopCart sc = Session["cart"] as Niunan.Shop.Model.ShopCart;
     83:                  sc.Update(int.Parse(proid), x);
     84:                  Session["cart"] = sc;
     85:  
     86:              }
     87:              Response.Redirect(Request.Url.ToString());
     88:  
     89:          }
     90:  
     91:          //删除购物车中的商品
     92:          protected void delete(object sender, EventArgs e)
     93:          {
     94:              string proid = (sender as LinkButton).CommandArgument;
     95:              if (Session["cart"] != null)
     96:              {
     97:                  Niunan.Shop.Model.ShopCart sc = Session["cart"] as Niunan.Shop.Model.ShopCart;
     98:                  sc.Delete(int.Parse(proid));
     99:                  Session["cart"] = sc;
    100:                  Response.Redirect(Request.Url.ToString());
    101:              }
    102:  
    103:          }
    104:  
    105:  
    106:  
    107:  
    108:      }
    109:  }
  • 相关阅读:
    SDP(12): MongoDB-Engine
    SDP(11):MongoDB-Engine功能实现
    SDP(10):文本式大数据运算环境-MongoDB-Engine功能设计
    React Native(五)——获取设备信息react-native-device-info
    React Native(四)——顶部以及底部导航栏实现方式
    去掉a标签
    React Native(三)——推送jpush-react-native
    react native (一)
    《JavaScript 秘密花园》
    正则表达式(overall)
  • 原文地址:https://www.cnblogs.com/iceicebaby/p/2446064.html
Copyright © 2011-2022 走看看