我正在更新一个经典的ASP应用程序,用jScript编写,当地的皮塔餐厅。我为他们的桌面网站创建了一个新的移动特定版本,允许订购交付和大量定制最终皮塔饼(想象一下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,则需要重新编号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;
这适用于每一个皮塔除了一个取代了删除一个,它返回“未定义”。例如,如果我的购物车中有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皮塔样例)为什么会在循环的第二,第三和第四次迭代中完美地工作,但不是第一次?
听起来像是你应该用Scripting.Dictionary解决的问题。它有访问和删除随机元素的方法:http://www.w3schools.com/asp/asp_ref_dictionary.asp – AardVark71
谢谢!我从来没有处理Scripting.Dictionary,它看起来是未来的一个很好的选择。不过,在这一点上,我的目标是(希望)解决这个特定的问题,而不必重写和重新测试整个应用程序。 –