将多个URL参数传递给Classic ASP

时间:2013-07-31 15:55:20

标签: javascript asp-classic

编辑:原来我的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阵列是如何工作的,从我读到的它们实际上很糟糕。

1 个答案:

答案 0 :(得分:0)

  

我真的不知道ASP阵列是如何工作的,从我读到的它们实际上很糟糕。

他们这样做,但在这种情况下并不重要。

一般资料

首先,你的JavaScript是错误的。

  • xs永远不会被宣布,因此它们是全球性的。不要这样做,总是用var声明所有变量。
  • 您没有正确编码网址参数。这必然会爆炸,总是使用正确的编码(在这种情况下为encodeURIComponent())。
  • 避免依赖全局变量。传递sales变量作为参数。
  • 避免裸for .. in迭代对象。使用hasOwnProperty()作为安全预防措施。这是一种很好的做法,可以防止对象原型扩展的情况。或者,使用为您提供通用each()功能的众多JS库中的一个。 Underscore.js,Sugar.js,jQuery都提供了这样的功能。或者自己写一个,就像我在下面做的那样。

其次,ASP已经很好地解决了这个问题。

如果在查询字符串中传递多个具有相同名称的参数,则服务器会将它们放入集合中。 (实际上,Request对象总是包含集合,即使您只传入一次URL参数也是如此。)

所以当你查询

http://foo/bar?sale=712-KR%3A1&sale=712-LR%3A1&sale=713-KR%3A1

请注意编码的:

然后ASP引擎将在一个集合中提供三个不同的值,如下所示:

"712-KR:1", "712-LR:1", "713-KR:1"
  • 此集合从1开始,因此Request("sale")(1)将为"712-KR:1",依此类推。
  • 您可以使用Request("sale").Count查找具有任何给定名称的参数数量。

此时我建议两件事。

  • 重写您的客户端代码,以便它发送多个具有相同名称的参数。
  • 切换到ASP端的dictionaries,而不是尝试使用数组。

客户端

js Helper(如果你已经使用了库,这可能实际上是不必要的)

function each(obj, callback) {
    var key;

    for (key in obj) {
        if (obj.hasOwnProperty(key)) {
            callback(key, obj[key]);
        }
    }
}

JS

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=");

    // ...
}

服务器

ASP助手

Function NewDict() 
    Set NewDict = Server.CreateObject("Scripting.Dictionary")
End Function

Function Count(ary)
    If IsArray(ary) Then
        Count = UBound(ary) - LBound(ary) + 1
    Else
        Count = vbEmpty
    End If
End Function

ASP

Function ParseSales(params) 
    Dim sales, sale, parts, saleId, value, product

    Set sales = NewDict()

    For Each sale In params
        parts = Split(sale, "-")
        saleId = parts(0)

        ' let's be careful and do a sanity check 
        If Count(parts) = 2 and IsNumeric(saleId) Then
            product = Split(parts(1), ":")

            If Count(product) = 2 Then
                If Not sales.Exists(saleId) Then
                    sales.Add saleId, NewDict()
                End If

                sales(saleId).Add product(0), product(1)
            Else
                ' Invalid parameter format, react accordingly
            End If
        Else
            ' Invalid parameter format, react accordingly
        End If
    Next

    Set ParseSales = sales
End Function

现在你可以在服务器端做各种各样的事情了

Dim sales, saleId
Set sales = ParseSales(Request("sales"))

Response.Write sales.Exists("712")        ' -> True
Response.Write sales.Exists("714")        ' -> False
Response.Write sales("712").Count         ' -> 2
Response.Write sales("712")("KR")         ' -> 1
Response.Write sales("712").Exists("XR")  ' -> False

Response.Write Join(sales.Keys(), "; ")         ' -> 712; 713
Response.Write Join(sales("712").Keys(), "; ")  ' -> KR; LR

For Each saleId In sales
    ' saleId will be "712" and so on, use sales(saleId) to get the 
    ' actual object and do something with it
Next