#foreach #scope #asp-classic
#foreach #область #asp-классический
Вопрос:
У меня есть следующий код:
dim key
for each key in Request.Querystring
'do something
key = sanitized_param(key)
next
Мой вопрос к вам, знатоку classic-asp, передает ли classic-asp или asp в целом переменные как ссылки (память) или по значению? Пытаюсь выяснить, очищаю ли я ключевую переменную и передаю ее обратно самой себе, она просто «живая» для этого цикла, или новое значение передается в исходную строку запроса?
Комментарии:
1.
Request.QueryString
это особый тип коллекции, доступной только для чтения , другие включаютRequest.Form
иRequest.ServerVariables
.
Ответ №1:
Request.QueryString
извлекает параметры строки запроса по значению из заголовков страницы.
Вы можете вносить изменения в строку запроса только после того, как она была получена через Request.QueryString
, но вы не можете вносить изменения непосредственно в Request.QueryString
, поскольку она доступна только для чтения (если бы вы могли вносить изменения, вы бы, вероятно, использовали Response.QueryString
, но это недопустимая команда ответа).
Я предполагаю, что вы пытаетесь очистить все строки вашего запроса за один раз? На самом деле это невозможно или действительно необходимо. Обычно строку запроса следует очищать по мере ее запроса:
Response.Write(sanitized_param(Request.QueryString("myQS")))
Или сначала присвоить строку запроса переменной, а затем очистить ее:
Dim myQS
myQS = Request.QueryString("myQS")
myQS = sanitized_param(myQS)
' or
myQS = sanitized_param(Request.QueryString("myQS"))
Как только строка запроса была присвоена переменной и очищена, вы можете ссылаться на эту переменную так часто, как вам нравится, без необходимости снова передавать ее в вашу функцию очистки.
Кроме того, ваш пример кода не имеет особого смысла. key
Значение в вашем for each
цикле ссылается только на имена строк вашего запроса, а не на их значения. Если Response.QueryString
была допустимая команда ASP, вы бы выполнили:
Response.QueryString(key) = sanitized_param(Request.QueryString(key))
Но опять же, это невозможно.
РЕДАКТИРОВАТЬ: Это решение может быть тем, что вы ищете:
Создайте объект словаря, назовите его, например, QueryString. Переберите все строки вашего запроса и добавьте исправленную версию к объекту dictionary.
Dim QueryString : Set QueryString = Server.CreateObject("Scripting.Dictionary")
For Each Item In Request.QueryString
QueryString.Add Item,sanitized_param(Request.QueryString(Item))
next
Теперь, чтобы получить исправленную версию строки запроса, просто используйте:
QueryString.Item("query_string_name")
Или для исходной неочищенной версии, которую вы все еще могли бы использовать:
Request.QueryString("query_string_name")
Точно так же, Request.QueryString
объект dictionary прощает и не вернет ошибку, если вы запросите строку запроса, которая не существует.
Вы также могли бы создать функцию для извлечения исправленных строк запроса, например:
Function SanitizedQS(ByVal qsName)
SanitizedQS = sanitized_param(Request.QueryString(qsName))
End Function
И вместо использования Request.QueryString("query_string_name")
просто используйте SanitizedQS("query_string_name")
.
Комментарии:
1. спасибо за объяснение, считайте мой код псевдокодом, я знаю о его неправильном синтаксисе. Но да, это именно то, что я пытаюсь сделать, то есть очистить все входные запросы за один раз. Мне придется придумать другое решение, спасибо.
2. @Irving Luna Это возможно. Вы могли бы перебрать строки вашего запроса и добавить исправленную версию к объекту dictionary, а затем просто использовать dictionary для извлечения исправленных строк запроса вместо использования
Request.QueryString
. Я обновил свой ответ примером.