100分救急啊!!cookie购物车问题
当A用户在自己电脑上访问此购物网站,将商品添加到购物车中后,没提交订单,也没清空购物车,此时B用户也用自己电脑访问此购物网站,也将商品添加到购物车中 ,但是此时B的购物车中有A用户购物车的商品,这是怎么回事啊?貌似购物车是公用的?求解,下面贴代码using System;--------------------编程问答-------------------- 把static去掉试试:
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]);
}
}
}
}
}
public static DataTable dt;
--------------------编程问答-------------------- 同#1楼。。
另外 你cookie中也没有区分用户啊 --------------------编程问答-------------------- Static的话,好像所有人都公用一个购物车了,问题大了。
用户问题,需要将用户id什么的也保存在cookie里面。ReadCookie的时候和当前登录用户比较。 --------------------编程问答-------------------- 不能用Static 这个作用域太大了.所有人都能用了! --------------------编程问答-------------------- 这里有源码事例,你下载看看把.很清楚!
Asp.net购物车示例源码
可以实现购物车基本功能:在线购物、在线结算、在线充值、在线支付(未完成)
有用户注册功能
默认用户密码51aspx
数据库文件在App_Data文件夹下附加即可,数据库名称不要更改
注意:web.config默认配置不要更改,sa帐号务必为空,如果需要更改请对.cs文件相应修改然后编译 --------------------编程问答--------------------
可以存个ID --------------------编程问答--------------------
公用购物车 ?那这要完蛋了,啥玩意都卖不出去了 --------------------编程问答-------------------- 不能用Static --------------------编程问答-------------------- 不要用Static,在同一应用程序中,声明为Static的只存在一个实例
这样就导致所有用户的购物车信息全在这一个datatable里面
cookies是客户端缓存技术,虽然名字都叫ShoppingCart,但是是保存在不同的客户端上,
每个客户端都是使用它自己的cookies。之所以cookies的数据重复,是因为他保存的datatable的内容都一样
--------------------编程问答-------------------- 顶 --------------------编程问答-------------------- 让购物车私有化!
--------------------编程问答-------------------- 不要用Static --------------------编程问答-------------------- 谢谢各位,但是我去掉Static后 删除购物车 和情况购物车都出错啊 --------------------编程问答-------------------- 代码要稍微改改
你的删除和清空未作判断
可能在datatable还是null的时候去调用它的方法就会报错
两个解决方法
一。删除,清空前判断是否为null
二。给ShopCar类增加构造函数
public ShowCar()
{
BuildDataTables();
}
--------------------编程问答-------------------- 那么多代码,看到头晕,路过,飘过,果断接分吧…… --------------------编程问答-------------------- Static的问题,Static之后大家都公用了!
如果没有Static你调用法方的时候等于new一个新cookie! --------------------编程问答-------------------- 建议你还是直接把购物车存数据库吧。 --------------------编程问答-------------------- 学习了学习了 --------------------编程问答-------------------- 去掉后,买再多的商品也只会显示一件商品(最后购买的),大家帮忙解决下啊,尽量说详细点啊,我能不能在追加100分啊。。 --------------------编程问答--------------------
每次把cookes的值取出来,加上新的,再组合回去啊 --------------------编程问答--------------------
那时因为你没次都new是否?你判断是否购物的时候你应该先判断cookie是否存在,然后解析下cookie看他属于谁!或者在你这些基础方法中判断一下!不然你后台每次调用就会新建一个新的cookie! --------------------编程问答-------------------- 购物车用的Cookie实现的吧,同一个站点下的Cookie没有加标识,所以访问时相互混淆了
你可以利用Cookies["A"]["Quantity"] = 123; 用父键的形式来保存用户标识,子健保存数据 --------------------编程问答--------------------
+1 --------------------编程问答-------------------- 你存入Cookie中就可以了,无需使用DataTable
补充:.NET技术 , ASP.NET