删除一个时重新编号有序的会话变量

时间:2012-10-19 15:03:36

标签: ajax asp-classic jscript

我正在为一家当地的皮塔餐厅更新一个用jScript编写的经典ASP应用程序。我已经创建了一个新的移动专用版本的桌面网站,允许订购交付和大量定制最终皮塔饼(想象一下地铁的网站,这将允许你添加泡菜,生菜等)。每个皮塔饼都作为一串数字存储在会话变量中。还存储了皮塔斯的总数。会话可能如下所示:

PitaCount = 3  
MyPita1 = "35,23,16,231,12"  
MyPita2 = "24,23,111,52,12,23,93"  
MyPita3 = "115,24"  

我知道可能有更好的方法来存储数据,但就目前而言,由于整个事情都是书写,工作和生活(而且客户很满意),我想解决我遇到的问题。这是问题......

我在订单回顾页面上有按钮,允许客户从购物车中删除pitas。当我这样做时,我想重新编号会话变量。如果客户删除了MyPita1,我需要将MyPita2重新编号为MyPita1,将MyPita3重新编号为MyPita2,然后减少PitaCount。

AJAX按钮向ASP文件发送一个整数,其中包含要删除的皮塔饼的编号(DeleteID)。我的函数查看PitaCount和DeleteID。如果它们都是1,它就会放弃会话。如果它们都相同但大于1,我们将删除最近添加的皮塔饼,因此不需要重新编号。但是,如果PitaCount大于DeleteID,我们需要对pitas重新编号。这是我用来做的代码:

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;

这适用于每个皮塔除了替换已删除的皮塔之外,它将返回'undefined'。例如,如果我的购物车中有6个pitas,并且我删除了MyPita2,那么我最终会在购物车中放入5个pitas。数字1,3,4和5正是您所期望的,但MyPita2返回undefined。

我还尝试了一个WHILE循环:

while (DeleteID < PitaCount) {
    Session("MyPita" + DeleteID) = String(Session.Contents("MyPita" + (DeleteID+1)));
    DeleteID++;
};
Session.Contents.Remove("MyPita" + PitaCount);
PitaCount--;
Session.Contents("PitaCount") = PitaCount;

这也会返回'undefined',就像上面那样。

直到我能够完成这项工作,我只是将最新的皮塔饼写入已删除的皮塔饼所腾出的地方,但这会重新排序购物车,我认为这是一个可用性问题,因为人们期望他们添加到购物车中的商品保持相同的顺序。 (是的,我可以在会话中添加某种时间戳并使用它来订购,但我认为解决我遇到的问题会更快。)

我很困惑。为什么(使用上面的6个pita示例)它会在循环的第二次,第三次和第四次迭代中完美地工作,而不是第一次?

1 个答案:

答案 0 :(得分:2)

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

var DeleteID = Session("DeleteID");

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

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

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

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