Для каждого ввода по ссылке или значению

#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 . Я обновил свой ответ примером.