ASP.NET 2.0打造购物车和支付系统之二(2)
点击次数:14 次 发布日期:2008-11-26 12:16:14 作者:源代码网
|
源代码网推荐
源代码网推荐 图2.示例程序中实现的购物篮。 源代码网推荐 源代码网推荐 购物篮(参考图2)用于存储产品(顾客通过点击紧邻每一种产品的"Add to basket"按钮从产品列表中选择)。把购物篮存储在会话状态中的实现是不错的技术,因为在一次完整的购物中,在任何时候顾客决定离开你的站点,或可能倒空他们的购物篮时,所有这些数据都有可能被丢弃。当然,由于若干原因,例如为了市场调查目的以标识谁在分析什么以及判断购物潮流等时,你还可以选择把顾客的购物篮内容存储在一个数据库中。另一个理由可能是,向他们展示"Last time you were here you looked at these items ..."类型显示。这要求你有一个方法来区分顾客。两种通常使用的技术是,把一个cookie存储在用户自己的系统中-通过使用一个唯一的ID来标识他们的未来访问,或使用他们的登录ID来加以区别(如果你已经实现顾客登录的话)。 源代码网推荐 源代码网推荐 更新的购物篮还使用createProductDT()函数来创建它的初始的空DataTable。在本演示程序中,我们将使用相同的表格结构,但是你可以通过删除一些数据列来进一步"提炼"你的购物篮。在大多数情况下,你仅需要存储每种产品的ID和数量,由于你能够容易地基于它的ID查找实际的产品细节。 源代码网推荐 源代码网推荐 每次经由产品列表把一个产品添加到篮中时,它的"Add to basket"按钮都会激活一个OnServerClick事件: 源代码网推荐 源代码网推荐 protected void shoPBuy_OnServerClick(object source, EventArgs e) 源代码网推荐 { 源代码网推荐 int index = ((GridViewRow)((HtmlInputButton)source).Parent.NamingContainer).RowIndex; 源代码网推荐 addToBasket(Convert.ToInt32(gvProducts.DataKeys[index].Value)); 源代码网推荐 } 源代码网推荐 protected void addToBasket(int productID) 源代码网推荐 { 源代码网推荐 DataTable dtBasket = getBasketDt(); 源代码网推荐 //循环遍历购物篮并检查是否该项已经存在 源代码网推荐 bool found = false; 源代码网推荐 for(int i = 0; i < dtBasket.Rows.Count; i++) 源代码网推荐 { 源代码网推荐 if(Convert.ToInt32(dtBasket.Rows[i]["id"]) == productID) 源代码网推荐 { 源代码网推荐 //增加数量并且标记为已发现 源代码网推荐 dtBasket.Rows[i]["quantity"] = Convert.ToInt32(dtBasket.Rows[i]["quantity"]) + 1; 源代码网推荐 found = true; 源代码网推荐 //当我们已经找到一项时跳出循环 源代码网推荐 break; 源代码网推荐 } 源代码网推荐 } 源代码网推荐 //如果该项没有找到,则把它添加为一个新行 源代码网推荐 if(!found) 源代码网推荐 { 源代码网推荐 DataTable dtProducts = getProductsDt(); 源代码网推荐 DataRow drProduct = dtProducts.Rows.Find (productID); 源代码网推荐 //现在,我们已经从数据源中得到了需要的数据,那么我们将把一个新行添加到购物篮中 源代码网推荐 DataRow newRow = dtBasket.NewRow(); 源代码网推荐 newRow["id"] = drProduct["id"]; 源代码网推荐 newRow["name"] = drProduct["name"]; 源代码网推荐 newRow["price"] = drProduct["price"]; 源代码网推荐 newRow["quantity"] = 1; 源代码网推荐 dtBasket.Rows.Add(newRow); 源代码网推荐 } 源代码网推荐 //把新更新的购物篮存储回会话中 源代码网推荐 Session["dtBasket"] = dtBasket; 源代码网推荐 //更新购物篮,也即是"重新绑定它" 源代码网推荐 updateShopBasket(); 源代码网推荐 } 源代码网推荐 源代码网推荐 我们是使用shopBuy_OnServerClick()函数来"捕获"这一点的(这个函数能标识按钮属于哪一行),得到相关产品的ID并用它来调用addToBasket()。在该函数内,我们可以使用给定的产品ID来检查购物篮。如果它已经存在于购物篮中,那么我们需增加它的数量;而如果它不存在,那么我们把它添加为一个新行。最后,我们把购物篮重新绑定到它的更新的DataSource上。参考图3。 源代码网推荐
源代码网推荐 该购物篮,就象产品GridView一样,也使用TemplateColumns;因此,我们可以在每一行上建立一个数量文本框。这为顾客提供一种容易的方式来更新他们要求的每一种商品的数目。一旦他们改变了这些值,他们点击在购物篮下面的"Update Quantities"按钮。这将激活一个为shopUpdateBasketQuantities_OnServerClick()所捕获的OnServerClick事件。这类似于addToBasket()函数:我们必须定位购物篮中的产品,然后更新它的数量。区别在于:当检查从文本框中检索的数据时,我们必须小心,因为你根本不会知道什么人能够进入到其中致使弄乱你的系统。下面是处理这一检查的函数的部分代码片断: 源代码网推荐 源代码网推荐 //从Quantity文本框中读取数据 源代码网推荐 HtmlInputText itQuant = (HtmlInputText)row.FindControl("itProductQuantity"); 源代码网推荐 //把该值转换成一个整数 源代码网推荐 try 源代码网推荐 { 源代码网推荐 int quant = Convert.ToInt32(itQuant.Value); 源代码网推荐 源代码网推荐 /*如果该值成功转换成一个整数,那么我们还 源代码网推荐 需要检查它不是一个负数;否则的话,我们可能欠 源代码网推荐 顾客钱!*/ 源代码网推荐 if(quant > 0) 源代码网推荐 { 源代码网推荐 drProduct["quantity"] = quant; 源代码网推荐 } 源代码网推荐 else 源代码网推荐 { 源代码网推荐 drProduct.Delete(); 源代码网推荐 } 源代码网推荐 } 源代码网推荐 catch 源代码网推荐 { 源代码网推荐 //如果我们不能把它转换成整数,那么我们不作什么改变。 源代码网推荐 } 源代码网推荐 源代码网推荐 例如,如果有人在quantity域中输入-100,你可能还会欠他们的钱!不过,一般地,你可能不会把钱支付给他们,但是这要依赖于你的支付系统是如何建立的。由于这个原因,我们把这个整数分析包装到一个try/catch语句块内,以便在不能分析的情况下,我们保留原来的值不变。此后,我们检查这个quantity以确保它大于零。如果它小于或等于零,那么我们删除这一行。最后,在检查完购物篮中所有的产品并且修改它们各自相应的数量后,我们即保存购物篮并更新显示。 源代码网推荐 源代码网推荐 购物篮的最后一个关键组成是updateShopBasket()函数: 源代码网推荐 源代码网推荐 private void updateShopBasket() 源代码网推荐 { 源代码网推荐 gVBasket.DataSource = getBasketDt(); 源代码网推荐 gvBasket.DataBind(); 源代码网推荐 ibEmptyBasket.Visible = ibUpdateBasketQuantities.Visible = ibBasketCheckout.Visible = gvBasket.Rows.Count > 0; 源代码网推荐 } 源代码网推荐 源代码网推荐 这个函数能够从会话状态中提取购物篮的一个副本,这反过来将创建会话购物篮,如果它已经不存在的话,然后绑定到GridView。其最终目的是隐藏或显示三个购物篮按钮;因为如果购物篮为空的话,不需要显示它们。 源代码网推荐 做人要厚道,请注明转自酷网动力(www.ASPCOOL.COM)。 源代码网推荐 源代码网供稿. |
