1

我正在为当地的皮塔餐厅更新一个用 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 示例)它会在循环的第二次、第三次和第四次迭代中完美运行,但在第一次迭代中却不行?

4

1 回答 1

2

我不能确定,但​​我认为你的问题可能是值DeleteID是一个字符串。这可能会发生,您可以通过执行以下操作来分配其值:

var DeleteID = Session("DeleteID");

假设这是真的,那么在循环的第一次迭代中(写入删除的点),y是一个字符串,并且表达式y+1被解释为字符串连接而不是数字加法。例如,如果您删除 ID 1,您实际上是将 id 11 ( "1" + 1) 中的值复制到已删除的位置,而这在您的测试中可能不存在。这可以通过将至少 11 件商品添加到您的购物车然后删除第一个来进行测试。在下一次迭代中,增量运算符++强制y为数字,因此脚本从那时起按预期工作。

DeleteID解决方案是在初始化循环时转换为数字:

for (y = +DeleteID; y < PitaCount; y++) {

将字符串转换为数字可能有更好的方法,但这+是我记得的。

于 2012-10-21T07:00:13.347 回答