对于每个通过引用或值

For each in by reference or value

我有以下代码:

dim key
for each key in Request.Querystring
  'do something
  key = sanitized_param(key)
next

我的问题是 classic-asp 行家,classic-asp 或一般的 asp 是将变量作为引用(内存)传递还是按值传递?试图弄清楚我是否清理了关键变量并将其传回给自己,它只是那个循环的 "alive",还是新值被传递给了原始的 QueryString?

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

将查询字符串分配给变量并进行清理后,您可以随意引用该变量,而无需再次将其传递给清理函数。

此外,您的示例代码没有多大意义。 for each 循环中的 key 值仅引用查询字符串的名称,而不是它们的值。如果 Response.QueryString 是一个有效的 ASP 命令,你会做:

Response.QueryString(key) = sanitized_param(Request.QueryString(key))

但同样,这是不可能的。


编辑: 这个解决方案可能就是您要找的:

创建一个字典对象,例如调用它"QueryString"。遍历所有查询字符串并将经过清理的版本添加到字典对象。

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 一样,字典对象是宽容的,如果您请求不存在的查询字符串,它不会 return 出错。


您还可以创建一个函数来检索经过清理的查询字符串,例如:

Function SanitizedQS(ByVal qsName)
    SanitizedQS = sanitized_param(Request.QueryString(qsName))
End Function

而不是使用 Request.QueryString("query_string_name") 只需使用 SanitizedQS("query_string_name").