科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件ASP.NET 2.0打造购物车和支付系统之二

ASP.NET 2.0打造购物车和支付系统之二

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

在本篇中,我们将经由一个简单的网上商店演示程序来探讨GridView

作者:朱先忠编译 来源:天极开发 2007年11月6日

关键字: Windows

  • 评论
  • 分享微博
  • 分享邮件
三、购物篮


图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。


图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。其最终目的是隐藏或显示三个购物篮按钮;因为如果购物篮为空的话,不需要显示它们。
    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章