【问题标题】:How to check if a POST submitted field exists in VBScript?如何检查 VBScript 中是否存在 POST 提交的字段?
【发布时间】:2013-08-07 18:09:59
【问题描述】:

提交表单后,如何检查服务器端是否存在特定字段?例如:

If [Exists] Request("FieldName") Then
    ...
End If

【问题讨论】:

    标签: asp-classic vbscript


    【解决方案1】:
    If Request("FieldName").Count > 0 Then
        ...
    End If
    

    或者,简称:

    If Request("FieldName").Count Then
        ...
    End If
    

    背景:

    • Request 集合很神奇,因为它不会在您尝试访问不属于请求的密钥时引发错误 - 但对于不存在的密钥,.Count 将为 0。
    • 在 URL 编码的查询字符串中,发送没有值的键是合法的,例如 foo&bar&baz
    • 多次发送同一个密钥也是合法的,即每个密钥有多个值,例如foo=value1&foo=value2

    因此,确定密钥是否已被客户端发送的可靠方法是计算客户端发送了多少次。

    此测试的一个特殊情况是检查该键是否存在非空值 (If Request("FieldName") > "")。这最终可能是也可能不是您想要的;请注意,查询字符串的基本行为比这更广泛。

    【讨论】:

      【解决方案2】:

      要检查参数是否存在(不关心它的值),也可以这样写:

      fieldValue = Request("FieldName")
      if Not IsEmpty(fieldValue) ...
      

      与上面的 Count 方法相比,一个优点是您可以测试变量,而无需再次引用字段名称。 测试 "" 的优势在于,如果您通过 &FieldName 而不分配值,则测试 "" 将产生 true,但 IsEmpty 返回 false。

      编辑:事实证明这在 IIS 中不可靠。

      1. 对于单独带有 ?param 或 ?param=&param2 的 url,IsEmpty(param) 返回 false,但是
      2. 对于带有 ?param&param2 的 url,IsEmpty(param) 奇怪地返回 true ...

      【讨论】:

        【解决方案3】:

        检查是否为空。有几种不同的方法,但我见过更常用的一种是:

        If Request("FieldName") <> "" Then
         'etc.
        End If
        

        如果我可能会根据上下文从一个或另一个中获取变量,我通常会使用以下代码之一的一些变体来明确检查 FormQueryString 集合:

        Select Case True
            Case Request.Form("FieldName") <> ""
                'Run if the Form isn't empty
            Case Request.QueryString("FieldName") <> ""
                'Run if the QueryString isn't empty
            Case Else
                'Set a predefined default if they're both empty
        End Select
        

        或者嵌套的 If ... Then:

        If Request.Form("FieldName") <> "" Then
            'Run if the Form isn't empty
        ElseIf Request.QueryString("FieldName") <> "" Then
            'Run if the QueryString isn't empty
        Else
            'Set a predefined default if they're both empty
        End If
        

        如果我确切知道它来自哪个集合,我会专门检查那个集合。原因是我想确保它从我期望它来自的地方拉出我期望的东西。我不希望有人在我没想到的时候通过在QueryString 中发送一些东西来覆盖Form 值。

        来自MSDN

        如果指定的变量不在前五个之一中 集合,Request 对象返回 EMPTY。

        所有变量都可以通过调用Request(variable)直接访问 没有集合名称。在这种情况下,Web 服务器搜索 按以下顺序收集:

        • 查询字符串
        • 表格
        • Cookie
        • 客户证书
        • 服务器变量

        如果同名变量存在于多个集合中, Request 对象返回该对象的第一个实例 相遇。

        强烈建议在提及成员时 集合全名被使用。例如,而不是 Request.("AUTH_USER") 使用 Request.ServerVariables("AUTH_USER")。这个 允许服务器更快地定位到该项目。

        【讨论】:

        • JFTR: Else If(注意空格)将是一个嵌套条件。 ElseIf 不是。
        • @AnsgarWiechers 是的...我最初的意图是使用真正的嵌套 if,但我被同事分心了。 :P
        • 该字段可能存在,但该值可能只是空白。正确的方法是 Tomalak 的下面。
        • @blackvibes 空白就是存在的东西。在这两个答案中,您都会发现一个空白存在。无论您使用哪种技术,您仍然需要进一步验证 - 但这将是一个与所问问题不同的问题。 :)
        【解决方案4】:

        我通常检查提交按钮的值。如果单击它,它的值将与表单数据一起发布。因此,即使您所有的表单数据都是空白的,提交按钮的值也不会是。如果提交按钮的值为空,那么它没有被点击。

        if request("btn_Submit") <> "" Then
            response.write "form was submitted"
        end if
        

        如果您使用 javascript form.submit() 调用,这会更加困难,在这种情况下,我通常会选择隐藏字段。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-06-26
          • 2018-12-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多