<div style="text-indent: 2em;">

在网址中,可以设置一些查询参数(网址带个问号?,问号?后面的内容即为查询参数),如 http://www.myfootprints.cn/?functions=sin(x%2B1/x),就设置了functions为sin(x+1/x)。利用这些查询参数,可以预先对网页进行一些个性化定制(当然,这需要在网页里头设置好个性化定制的功能),上面的那个网址,即是说,打开 http://www.myfootprints.cn 这个网页,并在打开时呈现 y = sin(x+1/x) 函数的图像。

在 ASP 开发中,有时需要根据当前页面的网址,给它指定一些查询参数(QueryString),并且不影响已经指定的其他参数。即,假如当前页面的网址为 http://www.myfootprints.cn,给它指定一个参数 functions=sin(x%2B1/x)。这种情况下,直接在网址后面添加一个问号?,然后再添加字符串“functions=sin(x%2B1/x)即可;然而如果传递过来的网址是 http://www.myfootprints.cn/?functions=x,那么,指定新参数 functions=sin(x%2B1/x) 的过程,就是直接将 functions=x 替换成 functions=sin(x%2B1/x) 就行了。

为了能够方便并且统一地处理这种指定查询参数的过程(有时是在最后添加,有时是对某些参数进行替换,有时两者都要进行),我设计了如下的函数来做这件事情。有了此函数GetQueryString(),在ASP开发中,对某个网址进行查询参数的设定,只需要这样调用就行了:

Dim sUrl
sUrl = Request.ServerVariables("PATH_INFO") & GetQueryString("functions=sin(x%2B1/x)")

如果要指定多个参数,则将这些参数用数组的形式传递给GetQueryString()就行了。如:

Dim sUrl
sUrl = Request.ServerVariables("PATH_INFO") & GetQueryString(Array("functions=sin(x%2B1/x)", "minOfx=-10", "maxOfx=10"))

以下是GetQueryString()的源代码:

Public Function GetQueryString(saSpecQueryStrings)
    Dim sCurQueryString, sSpecField, vSpecValue, i, lIndex, lIndex2
    
    ' 获取当前的查询字符串
    sCurQueryString = Request.ServerVariables("QUERY_STRING")
    If Len(sCurQueryString) > 0 Then
        If IsArray(saSpecQueryStrings) Then
            For i = LBound(saSpecQueryStrings) To UBound(saSpecQueryStrings)
                sSpecField = Split(saSpecQueryStrings(i), "=")(0)
                vSpecValue = Split(saSpecQueryStrings(i), "=")(1)
                ' 找到形如 sField=vValue& 的开始和结束位置
                lIndex = InStr(1, sCurQueryString, sSpecField & "=")                                            
                If lIndex > 0 Then
                    lIndex2 = InStr(lIndex, sCurQueryString, "&")
                    ' 如果指定的查询字符串(i)在当前查询字符串中已经存在,则用指定的查询字符串(i)替换
                    GetQueryString = Left(sCurQueryString, lIndex-1) & sSpecField & "=" & vSpecValue 
                    If lIndex2 > 0 Then
                        GetQueryString = GetQueryString & Right(sCurQueryString, Len(sCurQueryString) - lIndex2 + 1)
                    End If
                    sCurQueryString = GetQueryString
                Else
                    ' 否则,将指定的查询字符串接在最后
                    sCurQueryString = sCurQueryString & "&" & saSpecQueryStrings(i)
                End If
            Next
        Else
            sSpecField = Split(saSpecQueryStrings, "=")(0)
            vSpecValue = Split(saSpecQueryStrings, "=")(1)
            ' 找到形如 sField=vValue& 的开始和结束位置
            
            lIndex = InStr(1, sCurQueryString, sSpecField & "=")
            
            If lIndex > 0 Then
                lIndex2 = InStr(lIndex, sCurQueryString, "&")
                ' 如果指定的查询字符串(i)在当前查询字符串中已经存在,则用指定的查询字符串(i)替换
                GetQueryString = Left(sCurQueryString, lIndex-1) & sSpecField & "=" & vSpecValue 
                If lIndex2 > 0 Then
                    GetQueryString = GetQueryString & Right(sCurQueryString, Len(sCurQueryString) - lIndex2)
                End If
                sCurQueryString = GetQueryString
            Else
                ' 否则,将指定的查询字符串接在最后
                sCurQueryString = sCurQueryString & "&" & saSpecQueryStrings
            End If
        End If
    Else
        sCurQueryString = Join(saSpecQueryStrings, "&")
    End If
    GetQueryString = sCurQueryString
End Function