2.6 购物车管理页设计

2.6.1 购物车管理页概述

购物车功能的实现是本网站的关键,主要用于显示及管理用户的购物信息。用户在浏览商品的过程中,如果遇到想要购买的商品,单击商品下方的“购买”按钮,即可将该商品的信息添加到购物车中,通过单击页面顶部导航栏中的“购物车”链接进入购物车管理页面,可以进行查看和编辑商品信息等操作。购物车管理页包括的功能如下:

 将商品添加到购物车。

 浏览购物车中的商品信息。

 修改购物车中的商品数量。

 删除购物车中的商品。

 清空购物车。

购物车管理页(shopCart.aspx)的运行效果如图2.25所示。

图2.25 购物车页面运行效果

2.6.2 购物车管理页技术分析

在实现购物车管理页的功能时主要应考虑两点:一是如何区分用户与购物车的对应关系;二是购物车中商品存放的结构。

(1)用户与购物车的对应关系

用户与购物车的对应关系,即每个用户都有自己的购物车,购物车不能混用,而且必须保证当用户退出系统时,其购物车也随之消失。这种特性正是Session对象的特性,所以使用Session对象在用户登录期间传递购物信息。

(2)购物车中商品存放的结构

实现购物功能的实质是增加一个(商品名,商品个数)的(名,值)对,该结构正是一个哈希表(Hashtable)的结构(哈希表是键/值对的集合),所以使用哈希表(Hashtable)来表示用户的购买情况。

在.NET Framework中,哈希表是System.Collections命名空间提供的一个容器,用于处理和表现类似key/value的键值对,其中key通常用来快速查找,同时key是区分大小写;value用于存储对应的key值。Hashtable中key/value键值对均为object类型,所以Hashtable可以支持任何类型的key/value键值对。

注意

在应用哈希表时,需要引入using System.Collections命名空间。

哈希表的一些简单操作介绍如下。

(1)在哈希表中添加一个key/value键值对:HashtableObject.Add(key,value)。

(2)在哈希表中移出某个键值对:HashtableObject.Remove(key)。

(3)在哈希表中移出所有元素:HashtableObject.Clear()。

根据以上两点的讲解,下面具体看一下如何应用哈希表和Session对象来实现购物车功能。以用户向购物车中添加商品为例,首先判断用户是否已经有了购物车,即判断Session["ShopCart"]对象是否为空,如果Session["ShopCart"]对象为空,表示用户没有购物车,则添加一个(名,值)对(“名”是这个商品的ID代号,“值”为1,表示购买了一个商品);如果Session["ShopCart"]对象不为空,获取其购物车,首先判断购物车中是否已经有该商品,如果有,则这个商品的“值”,即数量加1。代码如下:

例程14 代码位置:资源包\TM\02\B2C\B2C\Default.aspx.cs

代码贴士

❶CommandArgument属性:获取或设置可选参数,该参数与关联的CommandName一起被传递到Command事件。

语法格式如下:

public string CommandArgument { get; set; }

属性值:与关联的CommandName一起被传递到Command事件的可选参数。默认值为String.Empty。

尽管可以单独设置CommandArgument属性,但该属性通常也只在设置了CommandName属性时才使用。

2.6.3 购物车管理页实现过程

本模块使用的数据表:tb_BookInfo

1. 设计步骤

(1)在应用程序中新建一个Web窗体,命名为shopCart.aspx,将其作为MasterPage.master母版页的内容页,并设置为起始页。

(2)在页面中通过bootstrap+div为整个页面布局。从“工具箱”选项卡中拖放两个Label控件、一个GridView控件和4个LinkButton控件,通过属性窗口设置控件的属性。shopCart.aspx页面中各个控件的属性设置及其用途如表2.4所示。

表2.4 shopCart.aspx页面中各个控件的属性设置及其用途

2. 实现代码

在该页的后台shopCart.aspx.cs页中编写代码前,首先需要定义CommonClass类对象和DBClass类对象,以便在编写代码时调用该类中的方法,然后再定义3个全局变量。代码如下:

例程15 代码位置:资源包\TM\02\B2C\B2C\shopCart.Aspx.cs

在Page_Load事件中,创建一个自定义数据源,并将其绑定到GridView控件中,显示购物车中的商品信息。代码如下:

例程16 代码位置:资源包\TM\02\B2C\B2C\shopCart.Aspx.cs

在购物车信息显示框中,数量的显示是通过一个可写的TextBox控件来实现的,如果用户要修改商品的数量,可以在相应的文本框中进行修改。单击“更新购物车”链接按钮,购物车中的商品数量将会被更新。“更新购物车”的Click事件代码如下:

例程17 代码位置:资源包\TM\02\B2C\B2C\shopCart.aspx.cs

当用户需要删除购物车中某一类商品时,可以在购物车信息显示框中,单击该类商品后的“删除”链接按钮,将该商品从购物车中删除。“删除”链接按钮的Click事件代码如下:

例程18 代码位置:资源包\TM\02\B2C\B2C\shopCart.Aspx.cs

当用户单击“清空购物车”链接按钮时,将会清空购物车中的所有商品。“清空购物车”链接按钮的Click事件代码如下:

例程19 代码位置:资源包\TM\02\B2C\B2C\shopCart.aspx.cs

当用户单击“继续购物”链接按钮时,将会跳转到前台首页,继续购买商品。“继续购物”链接按钮的Click事件代码如下:

例程20 代码位置:资源包\TM\02\B2C\B2C\shopCart.aspx.cs

protected void lnkbtnContinue_Click(object sender, EventArgs e)
{
   Response.Redirect("Default.aspx");
}

当用户已购买完商品后,可以单击“前往服务台”链接按钮,将会跳转到服务台页(checkOut.asp)进行结算并提交订单。“前往服务台”链接按钮的Click事件代码如下:

例程21 代码位置:资源包\TM\02\B2C\B2C\shopCart.Aspx.cs

2.6.4 单元测试

在开发完购物车模块后,为了保证程序正常运行,一定要对模块进行单元测试。单元测试在程序开发中非常重要,只有通过单元测试才能发现模块中的不足之处,才能及时地弥补程序中出现的错误,在开发购物车模块时需注意如下问题:

当本网站的会员购完自己的商品欲查看购物车时,如果编写以下代码将会出现如图2.26所示的提示错误。

例程22 代码位置:资源包\TM\02\B2C\B2C\shopCart.aspx.cs

图2.26 编写购物车页时出现的错误信息

原因分析如下:

出现该错误主要是由于数组的索引值出现问题。从数组Rows[i][j]中取值时,应该从第一个下标元素开始取值,即Rows[0][0],而出现上面的错误就是数组Rows[i][j]的初始值是Rows[1][0],说明数组是从第二个元素开始取值的,所以会在应用程序中提示“确保列表中的最大索引小于列表的大小”错误信息。

解决方法:

应用foreach循环语句将数组中的元素值赋予新的商品数量,从数组$array中取值时,应该从第一个下标元素(即数组的第0个元素)开始取值到数组的最大下标-1结束,即可正确获取自己的购物车功能。更改后的代码如下:

例程23 代码位置:资源包\TM\02\B2C\B2C\shopCart.aspx.cs