我正在为当地的皮塔餐厅更新一个用 jScript 编写的经典 ASP 应用程序。我为他们的桌面网站创建了一个新的特定于移动设备的版本,它允许订购交付和大量定制最终的皮塔饼(想象一下 Subway 的网站,它允许您添加泡菜、生菜等)。每个皮塔饼都作为一串数字存储在会话变量中。皮塔饼的总数也被存储。会话可能如下所示:
PitaCount = 3
MyPita1 = "35,23,16,231,12"
MyPita2 = "24,23,111,52,12,23,93"
MyPita3 = "115,24"
我知道可能有更好的方法来存储数据,但是现在,由于整个事情都是编写的、工作的和生活的(并且客户很高兴),我只想解决我遇到的问题。这就是问题所在...
我在订单回顾页面上有按钮,允许客户从购物车中删除皮塔饼。当我这样做时,我想重新编号会话变量。如果客户删除了 MyPita1,我需要将 MyPita2 重新编号为 MyPita1,将 MyPita3 重新编号为 MyPita2,然后将 PitaCount 递减。
AJAX 按钮向 ASP 文件发送一个整数,其中包含要删除的皮塔饼编号 (DeleteID)。我的函数查看 PitaCount 和 DeleteID。如果它们都是 1,它只是放弃会话。如果它们都相同但大于一个,我们将删除最近添加的皮塔饼,因此不需要重新编号。但是,如果 PitaCount 大于 DeleteID,我们需要重新编号这些皮塔。这是我用来执行此操作的代码:
for (y=DeleteID;y<PitaCount;y++) {
Session("MyPita" + y) = String(Session.Contents("MyPita" + (y+1)));
};
Session.Contents.Remove("MyPita" + PitaCount);
PitaCount--;
Session.Contents("PitaCount") = PitaCount;
这适用于每个皮塔饼,除了替换已删除的皮塔饼,它返回“未定义”。例如,如果我的购物车中有 6 个皮塔饼,我删除了 MyPita2,我最终在购物车中有 5 个皮塔饼。数字 1、3、4 和 5 正是您所期望的,但 MyPita2 返回未定义。
我还尝试了一个 WHILE 循环:
while (DeleteID < PitaCount) {
Session("MyPita" + DeleteID) = String(Session.Contents("MyPita" + (DeleteID+1)));
DeleteID++;
};
Session.Contents.Remove("MyPita" + PitaCount);
PitaCount--;
Session.Contents("PitaCount") = PitaCount;
这也返回“未定义”,就像上面的一样。
在我能够完成这项工作之前,我只是将最新的皮塔饼写入已删除的皮塔饼腾出的位置,但这会重新排序购物车,我认为这是一个可用性问题,因为人们希望他们添加到购物车中的物品保留在相同的顺序。(是的,我可以在会话中添加某种时间戳并使用它进行排序,但我认为解决我遇到的问题会更快)。
我很困惑。为什么(使用上面的 6 pita 示例)它会在循环的第二次、第三次和第四次迭代中完美运行,但在第一次迭代中却不行?