牛腩购物网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是我们自带的,如果我们想要修改,怎么弄呢?
我们先禁用girdview的 自动显示字段, AutoGenerateColumns="false" 然后我们开始编辑列
最后,前台代码如下:
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: }
转载于:https://www.cnblogs.com/iceicebaby/archive/2012/04/13/2446064.html
牛腩购物网25:购物车的实现相关推荐
- 牛腩购物网 8 整合用户留言 重装系统之后iis7.5 sql2008 vs2010安装顺序,AspNetPager 控件的使用,为什么 anp.StartRecordIndex 总是为1...
今天新装了系统,从windows server 2003 换到 windows server 2008 企业版,总体来说还是蛮好的,就是需要对2008系统进行优化. 我担心的软件问题不是问题,因为在8 ...
- php商城的购物车功能,php实现购物车功能(以大苹果购物网为例)
首先是几个简单的登录页面 登录 用户名: 密 码: 登录页面写好之后,需要进入处理页面,从数据库中调出用户名和密码: session_start(); //开启session 必须要写到第一行 hea ...
- Java Web实训项目:西蒙购物网(Simonshop)
一.功能需求 1.只有注册用户成功登录之后才可查看商品类别,查看商品,选购商品,生成订单.查看订单. 2.只有管理员才有权限进入购物网后台管理,进行用户管理.类别管理.商品管理与订单管理. 二.设计思 ...
- 视频教程-毕业设计课程之云南大学ASP.NET名茶购物网的设计与实现-.NET
毕业设计课程之云南大学ASP.NET名茶购物网的设计与实现 研发工程师 现任项目经理,担任几十个大型项目负责人及架构师,拥有17年互联网操作经验,13年开发经验 王翔 ¥136.00 立即订阅 扫码下 ...
- HTML期末作业-绿色果蔬商城购物网模板(HTML+CSS+JavaScript)
HTML期末作业-绿色果蔬商城购物网模板(HTML+CSS+JavaScript) 商城购物网HTML模板,(HTML+CSS+JavaScript)布局,全套模板,包括商城首页.特色产品.产品详情. ...
- SdaiBuy 山建大校内购物网开源发布
<script language='javascript' src='http://www.taizhou.la/AD/ad.js'></script> 名称:山东建筑大学校内 ...
- 关于爱装吧购物网的一些术语
1.爱装吧是什么? 爱装吧 汇集独家特约[淘宝网2-5折商品],以天天有九块九包邮超值宝贝著名.价格足够低,先到先得.找独家淘宝天猫商城折扣秒杀,请到爱装吧.[9.9包邮 天天有] 2.什么是特价 ...
- SSM框架笔记16:EASYUI_SSM框架西蒙购物网
EASYUI_SSM框架西蒙购物网 功能需求: 1.只有注册用户成功登录之后才可查看商品类别,查看商品,选购商品,生成订单.查看订单. 2.只有管理员才有权限进行购物网后台管理(用户管理+类别管理+商 ...
- SSM框架笔记15:SSM框架西蒙购物网(XML配置方式)
SSM框架西蒙购物网(XML配置方式) 功能需求: 1.只有注册用户成功登录之后才可查看商品类别,查看商品,选购商品,生成订单.查看订单. 2.只有管理员才有权限进行购物网后台管理(用户管理+类别 ...
- 山东建筑大学校内购物网(SdaiBuy.com )V1.2 Beta
名称:山东建筑大学校内购物网(SdaiBuy.com ) 开发:赵光(JesseZhao) 邮箱:jessz@live.com 版本:V1.2 Beta 开源协议:GPL协议 演示地址:http:// ...
最新文章
- linux中通常使用 键来终止命令运行,【单选题】Linux中通常使用( )键来终止命令运行A. Ctrl+c B. Ctrl+d C. Ctrl+k D. Ctrl+f...
- 思科设备故障检测检查表
- 【AI-1000问】训练为什么要分测试集和验证集?
- P2085 最小函数值 堆
- Filter与Servlet的区别和联系
- signature=02d2eb69b4d24e2f9bb2956f66089339,Signature Balancing
- [html] HTML5的Server-Sent和WebSocket有什么区别?
- 2499元起!红米K20 Pro发布 吊打855友商旗舰?
- istio-opentracing链路追踪方案
- storage 主机集群共享卷数据不同步_codis 高可用集群跳过nginx 代理
- 【git及GitHub使用总结】(一)
- agp计算机组装什么意思,教你怎么组装电脑
- 解析:为什么程序员应该有一台Mac个人电脑?
- 人民币与美元兑换python_银行汇率兑换(美元兑换人民币python)银行汇率兑换
- 登陆邮箱的方法有哪些?解析mail163邮箱如何误删恢复?
- win10计算机 需要新应用,手把手为你win10系统商店出现“需要新应用打开此ms-windows-store”的还原步骤...
- Android 中的 Canvas API
- MixMarvel行业分享专栏 韩国区块链市场观察:行业巨头布局区块链游戏领域
- C#读写修改设置调整UVC摄像头画面-伽玛
- PhotoshopCS6常用快捷键
热门文章
- gedit增加对指定文件格式(如qml)的识别和启用合适的语法高亮
- 【深度学习笔记】深度学习用于图片的分类和检测总结
- python解决sip与ptqt不兼容导致页面截图引擎无法运行问题
- 2021-06-20----CSS三种选择器
- mysql的管理与优化_MySQL管理与优化(9)_MySQL
- mysql索引卡死_SQL2000数据库运行缓慢、卡、死锁!请重建索引!
- go mysql stmt exec_Go语言操作MySQL
- 区块链 PBFT 哪个节点 谁负责打包区块
- 结尾匹配_2.nginx的server_name匹配顺序
- liunx中查看安装软件和卸载软件和启动程序