首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > asp.net >

100分救急cookie购物车有关问题

2014-01-19 
100分救急啊!!cookie购物车问题当A用户在自己电脑上访问此购物网站,将商品添加到购物车中后,没提交订单,也

100分救急啊!!cookie购物车问题
当A用户在自己电脑上访问此购物网站,将商品添加到购物车中后,没提交订单,也没清空购物车,此时B用户也用自己电脑访问此购物网站,也将商品添加到购物车中 ,但是此时B的购物车中有A用户购物车的商品,这是怎么回事啊?貌似购物车是公用的?求解,下面贴代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Web;
using bldxw.DAL;

namespace bldxw.BLL
{
  public  class ShopCar
  {
      public static DataTable dt;
      /// <summary>
      /// 创建虚拟表
      /// </summary> 
      protected void BuildDataTables()
      {
          dt = new DataTable("Product");//新建一张商品表,表名为"Product"
       
          dt.Columns.Add(new DataColumn("ProductID"));    //商品编号
          dt.Columns.Add(new DataColumn("GoodsImageUrl"));//商品图片
          dt.Columns.Add(new DataColumn("ProductName"));  //商品名称
          dt.Columns.Add(new DataColumn("Size"));         //商品尺码
          dt.Columns.Add(new DataColumn("quantity"));     //购买数量
          dt.Columns.Add(new DataColumn("totalPrice"));   //商品总价
          dt.Columns.Add(new DataColumn("Price"));        //商品单价
          dt.PrimaryKey = new DataColumn[] { dt.Columns["ProductID"] }; //设置主键为ProductID

      }
      /// <summary>
      /// 查询购物车中的商品 
      /// </summary> 
      public DataTable GetProduct()
      {
          //判断cookie中是否存在数据
          if (HttpContext.Current.Request.Cookies["ShoppingCart"].Value=="")
          {
              if (dt == null)
              {
                  //如果虚拟表不存在则创建一个空的虚拟表
                  BuildDataTables();
              }
          }
          else
          {
              //如果cookie中存在数据则从cookie中加载数据到购物车
              ReadCookie();
          }
          return dt;
      }
      /// <summary>
      /// 往虚拟表中添加数据
      /// </summary>
      /// <param name="ProductID">商品编号</param>
      /// <param name="Quantity">购买数量</param>
      public void AddDatatable(int ProductID, int Quantity, string Size)
      {
          //按照产品编号查询所有产品信息
          DBHelp db = new DBHelp();
          DataTable dtt = db.OpenDT("select chanpin.chanpinName,chanpin.jiage ,image.img17,pinpai.pinpaiName,dalei.daleiName,xiaolei.xiaoleiName from chanpin,dalei,xiaolei,pinpai,image where(chanpin.pinpaiID=pinpai.pinpaiID and chanpin.daleiID=dalei.daleiID and chanpin.xiaoleiID=xiaolei.xiaoleiID and chanpin.imgID=image.imgID)and chanpin.chanpinID='" + ProductID + "'");
       //   product prod = new ProductInfo().GetProductByProductId(ProductID)[0];

          //新建一行数据
          DataRow dr = dt.NewRow();
         
          dr["ProductID"] = ProductID;
          dr["GoodsImageUrl"] = dtt.Rows[0]["img17"];


          dr["Size"] = Size;
          dr["ProductName"] =Convert.ToString( dtt.Rows[0]["pinpaiName"])+Convert.ToString( dtt.Rows[0]["daleiName"])+Convert.ToString( dtt.Rows[0]["xiaoleiName"]);
          dr["quantity"] = Quantity;
          dr["Price"] = dtt.Rows[0]["jiage"];
          dr["totalPrice"] = Quantity *Convert.ToInt32(dtt.Rows[0]["jiage"]);
          //将这一行数据添加到虚拟表中
          dt.Rows.Add(dr);
      }
      /// <summary>
      /// 添加商品到购物车
      /// </summary>
      /// <param name="ProductID">商品编号</param>
      /// <param name="Quantity">数量</param>
      public bool AddProduct(int ProductID, int Quantity, string Size)
      {
          if (dt == null)
          {
              BuildDataTables(); //如果不存在虚拟表为空则创建一个空的虚拟表
          }
          try
          {
              DataRow row = dt.Rows.Find(ProductID);//根据商品编号查找商品所在虚拟表中的行
              if (row == null)
              {
                  //如果在虚拟表中找不到商品,则添加新的行
                  AddDatatable(ProductID, Quantity,Size);
                  WriteInCookie();
              }
              else
              {
                  //如果找到了商品,则在原来商品基础上增加购买数量
                  row["Quantity"] = Convert.ToUInt32(row["Quantity"]) + Quantity;
                  row["totalPrice"] = decimal.Parse(row["Quantity"].ToString()) * decimal.Parse(row["Price"].ToString());
                  WriteInCookie();
              }
              return true;
          }
          catch
          {
              return false;
          }
      }
      /// <summary>
      ///按照商品编号删除商品信息
      /// </summary>
      /// <param name="ProductID">商品编号</param> 
      public bool DeleteProductByProductID(int ProductID)
      {
          try
          {
              DataRow rows = dt.Rows.Find(ProductID);
              dt.Rows.Remove(rows);
              WriteInCookie();
              return true;
          }
          catch
          {
              return false;
          }
      }
      /// <summary>
      /// 清空购物车
      /// </summary>
      /// <returns></returns>


      public bool AllDeleteProduct()
      {
          try
          {

              dt.Clear();
              
              WriteInCookie();
         
              return true;
          }
          catch
          {
              return false;
          }
      }
      /// <summary>
      /// 按照商品编号修改商品数量
      /// </summary>
      /// <param name="ProductID">商品编号</param>
      /// <param name="Quantity">购买数量</param>
      public bool UpdateProductByProductID(int ProductID, int Quantity)
      {
          try
          {
              DataRow rows = dt.Rows.Find(ProductID);
              rows["quantity"] = Quantity;
              rows["totalPrice"] = Quantity * decimal.Parse(rows["Price"].ToString());
              WriteInCookie();
              return true;
          }
          catch
          {
              return false;
          }
      }
    /*  protected string RandomStr(int RndNumCount)
      {
          string RandomStr;
          RandomStr = "";
          Random Rnd = new Random();
          for (int i = 1; i <= RndNumCount; i++)
          {
              RandomStr += Rnd.Next(1000, 9999).ToString();
          }
          return RandomStr;
      }*/
      /// <summary>
      /// 把虚拟表中的商品编号和购买数量转换成字符串并写入cookie
      /// </summary> 
      protected void WriteInCookie()
      {
         string str = "";
          foreach (DataRow row in dt.Rows)
          {
              str = row["ProductID"] + "|" + row["quantity"] + "|" + row["Size"] + "," + str;
          }
          str = str.TrimEnd(',');

          //往购物车中添加商品
          HttpCookie aCookie = null;
          if (HttpContext.Current.Request.Cookies["ShoppingCart"] == null)
          {
              //如果Cookies中不存在ShoppingCart,则创建
              aCookie = new HttpCookie("ShoppingCart");
             
          }
          else
          {
              //如果Cookies中存在ShoppingCart,则清空
              aCookie = HttpContext.Current.Request.Cookies["ShoppingCart"];


             aCookie.Value =null;

          }
           aCookie.Value = str;
      
          aCookie.Expires = DateTime.Now.AddHours(1);
          HttpContext.Current.Response.Cookies.Add(aCookie);
        
          
      }
      /// <summary>
      /// 从cookie中取出数据填充到虚拟表中
      /// </summary>
      protected void ReadCookie()
      {
          if (HttpContext.Current.Request.Cookies["ShoppingCart"] != null)
          {
              dt = null;
              BuildDataTables();
              //如果Cookies中存在ShoppingCart,则取出数据添加到Datatable中
              HttpCookie aCookie = HttpContext.Current.Request.Cookies["ShoppingCart"];

              string cart = aCookie.Value;

              string[] arr = cart.Split(',');

              for (int i = 0; i < arr.Length; i++)
              {
                  string[] str = arr[i].Split('|');
                  AddDatatable(Convert.ToInt32(str[0]), Convert.ToInt32(str[1]),str[2]);
              }
          }
      }

    }
}


公用购物车 ?那这要完蛋了,啥玩意都卖不出去了
[解决办法]
不能用Static
[解决办法]
不要用Static,在同一应用程序中,声明为Static的只存在一个实例
这样就导致所有用户的购物车信息全在这一个datatable里面

cookies是客户端缓存技术,虽然名字都叫ShoppingCart,但是是保存在不同的客户端上,
每个客户端都是使用它自己的cookies。之所以cookies的数据重复,是因为他保存的datatable的内容都一样

[解决办法]
引用:
不要用Static,在同一应用程序中,声明为Static的只存在一个实例
这样就导致所有用户的购物车信息全在这一个datatable里面

cookies是客户端缓存技术,虽然名字都叫ShoppingCart,但是是保存在不同的客户端上,
每个客户端都是使用它自己的cookies。之所以cookies的数据重复,是因为他保存的datatable的内容都一样

[解决办法]
让购物车私有化!

[解决办法]
不要用Static
[解决办法]
那么多代码,看到头晕,路过,飘过,果断接分吧……
[解决办法]
Static的问题,Static之后大家都公用了!
如果没有Static你调用法方的时候等于new一个新cookie!


[解决办法]
建议你还是直接把购物车存数据库吧。
[解决办法]
学习了学习了
[解决办法]

引用:
去掉后,买再多的商品也只会显示一件商品(最后购买的),大家帮忙解决下啊,尽量说详细点啊,我能不能在追加100分啊。。

每次把cookes的值取出来,加上新的,再组合回去啊
[解决办法]
引用:
去掉后,买再多的商品也只会显示一件商品(最后购买的),大家帮忙解决下啊,尽量说详细点啊,我能不能在追加100分啊。。

那时因为你没次都new是否?你判断是否购物的时候你应该先判断cookie是否存在,然后解析下cookie看他属于谁!或者在你这些基础方法中判断一下!不然你后台每次调用就会新建一个新的cookie!
[解决办法]
购物车用的Cookie实现的吧,同一个站点下的Cookie没有加标识,所以访问时相互混淆了
你可以利用Cookies["A"]["Quantity"] = 123; 用父键的形式来保存用户标识,子健保存数据
[解决办法]
引用:
购物车用的Cookie实现的吧,同一个站点下的Cookie没有加标识,所以访问时相互混淆了
你可以利用Cookies["A"]["Quantity"] = 123; 用父键的形式来保存用户标识,子健保存数据

+1
[解决办法]
你存入Cookie中就可以了,无需使用DataTable 

热点排行