Javascript 将多个URL参数传递给经典ASP

Javascript 将多个URL参数传递给经典ASP,javascript,asp-classic,Javascript,Asp Classic,Edit:原来我的JavaScript函数没有像我想的那样工作,但请在我修复JavaScript时帮助解决ASP问题。 编辑2: 使用alert(JSON.stringify(sales))查看对象,我得到以下结果: {"712":{"KR":1,"LR":0},"713":{"KR":1,"LR":0}} 编辑3: 需要重新编写我的销售脚本,我正在尝试使用对象,但它似乎不起作用,因为我对JS的这一部分没有太多经验 var products = { "KR" : 4, "LR

Edit:原来我的JavaScript函数没有像我想的那样工作,但请在我修复JavaScript时帮助解决ASP问题。

编辑2: 使用alert(JSON.stringify(sales))查看对象,我得到以下结果:

{"712":{"KR":1,"LR":0},"713":{"KR":1,"LR":0}}
编辑3:

需要重新编写我的销售脚本,我正在尝试使用对象,但它似乎不起作用,因为我对JS的这一部分没有太多经验

var products = { 
    "KR" : 4,
    "LR" : 6 
};
var sale = [ ];

function sale(id,product,value) 
{
    this.id = function prod(product,value) 
    {
        this.product = product;
        this.value = value;
    }
}

sale("N51","KR",0);
希望你能看到我在做什么,但这可能是非常错误的

谢谢你的长篇大论,这是非常有帮助的,我会在上面的代码生效后尽快完成所有的工作


好的,我有一个JavaScript脚本,它将对单个图像的销售进行排序

712和713是图像ID。然后KR和LR是产品,它只会将它们添加到URL变量中,如果它们确实有销售

function submitSales() 
{
    //URL Variable
    var urlVariable = "?sales=";

    for (x in sales)
    {
        urlVariable = urlVariable + x + "-";
        for (s in sales[x])
        {
            if (sales[x][s] > 0)
            {
                urlVariable = urlVariable + s + ":" + sales[x][s] + ",";
            }
        }
    }
    urlVariable = urlVariable.substring(0, urlVariable.length - 1);
}
如果我添加3种产品的销售额,则剩下以下字符串: ?销售额=712-KR:1,LR:1713-KR:1

现在,首先将这两张图片分开销售的最佳方式是什么,我只剩下:

712-KR:1,LR:1 713-KR:1

然后我真的需要把它们放在一个数组中,看起来像:

image(0) = 712 = product(0) = KR = 1
                 product(1) = LR = 1
image(1) = 713 = product(0) = KR = 1
我真的不知道ASP阵列是如何工作得那么好的,从我所读到的来看,它们实际上很糟糕

我真的不知道ASP阵列是如何工作得那么好的,从我所读到的来看,它们实际上很糟糕

确实如此,但在这种情况下,这并不重要

一般材料 首先,您的JavaScript是错误的

  • x
    s
    从不声明,因此它们是全局的。不要这样做,总是用
    var
    声明所有变量
  • 您没有正确编码URL参数。这肯定会爆炸,请始终使用正确的编码(
    encodeURIComponent()
  • 避免依赖全局变量。将
    sales
    变量作为参数传入
  • 避免为..使用裸露的
    。。在
    中迭代对象。使用
    hasOwnProperty()
    作为安全预防措施。这是针对对象原型已扩展的情况进行辩护的良好实践。或者,使用提供通用
    each()
    函数的众多JS库中的一个。Underline.js、Sugar.js和jQuery都提供了这样的功能。或者自己写一个,就像我在下面做的那样
其次,ASP已经很好地解决了这个问题

如果在查询字符串中传递多个同名参数,服务器会将它们放入一个集合中。(事实上,
请求
对象始终包含集合,即使只传入一次URL参数。)

所以当你询问

http://foo/bar?sale=712-KR%3A1&sale=712-LR%3A1&sale=713-KR%3A1
  • 此集合基于1,因此
    请求(“销售”)(1)
    将是
    “712-KR:1”
    ,依此类推
  • 您可以使用
    Request(“sale”).Count
    查找任意给定名称的参数数量
在这一点上,我建议两件事

  • 重写客户端代码,使其发送具有相同名称的多个参数
  • 切换到ASP端,而不是尝试使用数组
客户 js Helper(如果您已经在使用库,那么这实际上可能是不必要的)

js

服务器 ASP助手

函数NewDict() Set NewDict=Server.CreateObject(“Scripting.Dictionary”) 端函数 函数计数(ary) 如果是艾萨瑞,那么 计数=UBound(ary)-LBound(ary)+1 其他的 计数=vbEmpty 如果结束 端函数 ASP

函数解析销售(参数)
Dim销售、销售、零件、销售额、价值、产品
Set sales=NewDict()
以params进行的每次销售
零件=拆分(销售,“-”)
saleId=零件(0)
“让我们小心点,做一次精神检查
如果计数(部件)=2且为数字(saleId),则
产品=拆分(第(1)部分,“:”)
如果计数(乘积)=2,则
如果不存在sales.Exists(saleId),则
sales.Add saleId,NewDict()
如果结束
销售(saleId)。添加产品(0),产品(1)
其他的
'参数格式无效,请作出相应反应
如果结束
其他的
'参数格式无效,请作出相应反应
如果结束
下一个
设置销售=销售
端函数
现在,您可以在服务器端执行各种操作

Dim销售,saleId
Set sales=ParseSales(请求(“销售”))
Response.Write sales.Exists(“712”)”->True
Response.Write sales.Exists(“714”)”->False
回复。写销售(“712”)。计数'->2
回复。写销售(“712”)(“KR”)”->1
Response.Write sales(“712”)。存在(“XR”)”->False
Response.Write Join(sales.Keys(),“;”)->712;713
响应。写入Join(sales(“712”).Keys(),“;”)->KR;LR
对于销售中的每个saleId
'saleId将是“712”,以此类推,使用sales(saleId)获取
'实际对象并对其进行处理
下一个

请在JS中发布您的
sales
对象的结构。不过,ASP不会获得该结构,它将获得通过url变量传递的内容。顺便说一句,当然您可以在ASP端使用JScript而不是VBScript。在这种情况下,您可以简单地将整个JS对象作为JSON字符串传递。请您向我解释一下您的代码,它似乎不起作用,如果我在末尾警告urlVariable,我只得到“?sale=”。saleId和itemId变量在回调函数中来自何处。我读了一遍又一遍,脑子都转不过来了。我很确定你调用
submitSales时没有参数,这就是为什么你的不起作用。(我建议不要依赖全局
sales
变量。)您应该在该函数中设置断点,并在浏览器的开发人员工具中逐行遍历代码。这应该很容易理解
"712-KR:1", "712-LR:1", "713-KR:1"
function each(obj, callback) {
    var key;

    for (key in obj) {
        if (obj.hasOwnProperty(key)) {
            callback(key, obj[key]);
        }
    }
}
function submitSales(sales) {
    var urlVariable, params = [];

    each(sales, function (saleId, sale) {
       each(sale, function (itemId, val) {
           var param = saleId + "-" + itemId + ":" + val;

           if (val > 0) {
               params.push( encodeURIComponent(param) );
           }
       });
    });

    urlVariable = "?sale=" + params.join("&sale=");

    // ...
}