Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 购物车问题_C#_Asp.net_Shopping Cart - Fatal编程技术网

C# 购物车问题

C# 购物车问题,c#,asp.net,shopping-cart,C#,Asp.net,Shopping Cart,我已经在一个网站上实现了简单的购物车。我将购物车和物品保存在会话对象中。用户结账(使用Paypal)后,我清除购物车项目。这很好,但我在以下场景中看到了一个问题: 假设用户向购物车添加了一些项目,并打开另一个浏览器并登录。他现在可以在两个浏览器中看到这些项目。现在,如果他在一个浏览器中签出,他仍然能够在另一个窗口中看到购物车项目,因为两个浏览器都有单独的会话 我应该采取什么方法来避免这种情况,或者必须接受这种情况 编辑:-发布问题后,我一直在思考这个问题。我会满足于这个简单的解决方案,每当用户去

我已经在一个网站上实现了简单的购物车。我将购物车和物品保存在
会话
对象中。用户结账(使用Paypal)后,我清除购物车项目。这很好,但我在以下场景中看到了一个问题:

假设用户向购物车添加了一些项目,并打开另一个浏览器并登录。他现在可以在两个浏览器中看到这些项目。现在,如果他在一个浏览器中签出,他仍然能够在另一个窗口中看到购物车项目,因为两个浏览器都有单独的会话

我应该采取什么方法来避免这种情况,或者必须接受这种情况


编辑:-发布问题后,我一直在思考这个问题。我会满足于这个简单的解决方案,每当用户去结账时,我都会点击数据库来加载购物车,而不是会话。这样,我就不会点击数据库来显示购物车中的物品(在顶部),也不会有任何基于虚拟物品的结账。

您必须通知页面的购物车面板部分,并使用
setTimeout()
定期刷新它

但是,可能比它的价值更大-如果你做得对,再次单击第2页上的“签出”不会导致重复的事务,列表将在下一页加载时刷新

编辑


“正确操作”是指根据用户的Id跟踪购物车项目,而不仅仅是会话对象

从您在会话中保存购物车项目并且您有不同的会话开始,您就有了不同的购物车


要消除此问题,您需要为要保存购物车的所有会话设置一个公共位置,这是数据库中的一个表。此公用位置通过用户id连接到用户以太,通过用户cookie连接到用户以太。

您的web应用程序基于HTTP协议,它打开和关闭连接只是为了满足HTTP web请求。现在,如果您打开另外两个浏览器并在其中一个浏览器上签出,您仍然可以在另一个浏览器上看到相同的页面(infomration),这是很正常的。我认为您应该做的是避免用户可以签出两次,或者如果有人试图签出一个空的篮子(如果用户在第二个浏览器上点击签出,这就是您的情况) 在这种情况下,你可以只显示一条信息。如果您选择的解决方案应该每隔一段时间刷新页面,请记住如果用户打开并登录到250个不同的会话,可能会发生什么:您的web应用程序将被点击多少次? 如果您接受我的建议,所有用户会话将只得到一个错误页面,如:bastek为空。
我希望这是有意义的

项目是通过他们自己的唯一id+用户id跟踪的。但问题是我将项目x添加到购物车并签出,然后再次添加项目x并签出。没有办法知道它是同一个项目还是新项目:(在这种情况下,您确实希望签出两次,因为您分别添加了两个相同的项目?一旦项目签出,它将与某种交易/订单Id关联(我假设?),所以你可以看出他们是两个独立的实体,而不是一个真正的,一个重复的实体?你的解决方案肯定会消除这个问题,但它是一个非常小的网站,我现在不想一直实现共享会话等。我想我要添加到我的问题中的另一个选项。@Aritos这是一个很好的解决方案,但目前我将继续关于我在编辑的问题中概述的方法。