Ваш оператор for each
должен перебирать строки запроса в том порядке, в котором они были переданы, очень странно, что это не так, я никогда не слышал об этом раньше. Но так как ваши параметры пронумерованы, вы можете присвоить их массиву и изменить порядок на основе их числовых показателей.
Вот как я бы решил эту проблему, я не знаю, короче ли она, чем ваш метод разбиения и переупорядочения, но, похоже, она эффективна:
<%
if request.querystring.count > 0 then
Dim lookFor, queryStrings(), items(), x, y
' Specify the query string name to find and reorder. The name should have a numeric suffix.
lookFor = "item" ' Looking for item1, item2, item3, item4 etc...
' Create a 2d array, set the upperbound value to match the number of query strings passed.
ReDim queryStrings(request.querystring.count-1,1)
' Loop through each query string.
x = 0 : for each item in request.querystring
' We're only interested in query strings where the name starts with "item". Use inStr()
' with a textual comparison to check, and use replace() to check that the item name has
' a numeric suffix.
if inStr(1,item,lookFor,1) = 1 AND isNumeric(replace(item,lookFor,"",1,-1,1)) then
' Only store the number part of the query string name. This is needed for reordering later.
queryStrings(x,0) = int(replace(item,lookFor,"",1,-1,1))
queryStrings(x,1) = request.querystring(item)
x = x + 1
end if
Next
' The queryStrings array may contain empty values. We can't use "ReDim Preserve" to resize
' a 2d array, so instead let's create another 2d array and set the upperbound value to the
' number of items found.
ReDim items(x-1,1)
' Assign the non-empty data from the queryStrings array to the items array.
y = 0 : for x = 0 to uBound(queryStrings)
if NOT isEmpty(queryStrings(x,0)) then
items(y,0) = queryStrings(x,0)
items(y,1) = queryStrings(x,1)
y = y + 1
end if
next
' Reorder the items array.
Dim temp0, temp1
for x = uBound(items)-1 to 0 step-1
for y = 0 to x
if items(y,0) > items(y+1,0) then
temp0 = items(y+1,0)
temp1 = items(y+1,1)
items(y+1,0) = items(y,0)
items(y+1,1) = items(y,1)
items(y,0) = temp0
items(y,1) = temp1
end if
next
next
' Finally, output the reordered items array.
for x = 0 to uBound(items)
response.write lookFor & items(x,0) & ": " & items(x,1) & "<br>"
next
end if
%>
Давайте рассмотрим порядок строк запроса:
? Item3 = 3
& Item6 = 6
& Item2 = 2
& Item7 = 7
& Item4 = 4
& Item1 = 1
& Item5 = 5
Выход:
item1: 1
item2: 2
item3: 3
item4: 4
item5: 5
item6: 6
item7: 7
Давайте сделаем то же самое, но добавим некоторые дополнительные параметры:
? Foo1 = bar1
& Item2 = 2
& foo2 = bar2
& Item5 = 5
& Item1 = 1
& Item3 = 3
& Item4 = 4 < br /> & foo3 = bar3
Выход:
item1: 1
item2: 2
item3: 3
item4: 4
item5: 5
Дополнительные параметры игнорируются
Наконец, давайте передадим несколько дублирующих параметров:
? Item2 = 2
& Item4 = Four
& Item5 = 5
& Item1 = 1
& Item2 = Two
& Item3 = 3
& Item4 = 4
Выход:
item1: 1
item2: 2, два
item3: 3
item4: четыре, 4
item5: 5
EDIT: Я предполагал, что ошибка была в IIS или ASP, переупорядочивающем заголовок строки запроса (как-нибудь?), Но после просмотра вашего комментария, где вы сказали if I target the querystring with the index number it gets the order right
, заголовки, очевидно, правильны и ошибка лежит в методе for each
(как указано в другом ответе). Гораздо более простым решением было бы разделить необработанный заголовок строки запроса (вместо использования for each
) и выполнить цикл поиска элементов:
<%
Dim splitQS, reSplitQS, x, lookFor : lookFor = "item"
splitQS = split(Request.QueryString,"&")
for x = 0 to uBound(splitQS)
reSplitQS = split(splitQS(x),"=")
if uBound(reSplitQS) = 1 then
if inStr(1,reSplitQS(0),lookFor,1) = 1 then
response.write reSplitQS(0) & ": " &_
request.QueryString(reSplitQS(0)) & "<br>"
end if
end if
next
%>