对于每个引用或值

时间:2019-03-28 17:53:45

标签: foreach scope asp-classic

我有以下代码:

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

我对您的问题classic-asp行家来说,classic-asp或asp通常会将变量作为引用(内存)或按值传递吗?试图弄清楚是否我清理了键变量并将其传递回自身,是该循环的“活着”,还是将新值传递给了原始QueryString?

1 个答案:

答案 0 :(得分:2)

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”。遍历所有查询字符串,然后将净化后的版本添加到字典对象。

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


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

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

而不是使用Request.QueryString("query_string_name"),而要使用SanitizedQS("query_string_name")