对于每个通过引用或值
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")
.
我有以下代码:
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")
.