【问题标题】:How do you call a method from a variable in ASP Classic?如何从 ASP Classic 中的变量调用方法?
【发布时间】:2008-12-02 22:14:05
【问题描述】:

例如,我如何在下面运行 me.test?

myvar = 'test'
me.myvar

ASP 寻找方法“myvar”但没有找到。在 PHP 中我可以简单地说 $me->$myvar 但 ASP 的语法不区分变量和方法。有什么建议吗?

与此密切相关,ASP Classic中是否有method_exists函数?

提前致谢!

编辑:我正在编写一个验证类,并希望通过管道分隔的字符串调用方法列表。

例如,要验证名称字段,我会调用:

validate("required|min_length(3)|max_length(100)|alphanumeric")

我喜欢用单行显示给定字段的所有验证方式的想法。并且字符串的每个管道分隔部分都是方法的名称。

如果您有更好的设置建议,我会全力以赴!

【问题讨论】:

    标签: asp-classic vbscript late-binding


    【解决方案1】:

    您可以在 VBScript 中使用GetRef 函数来实现这一点:-

    Function Test(val)
      Test = val & " has been tested"
    End Function
    
    Dim myvar : myvar = "Test"
    Dim x : Set x = GetRef(myvar)
    Response.Write x("Thing")
    

    将向客户端发送“事物已被测试”。

    所以这是您使用 GetRef 的验证要求:-

    validate("Hello World", "min_length(3)|max_length(10)|alphanumeric")
    
    
    Function required(val)
        required = val <> Empty
    End Function
    
    
    Function min_length(val, params)
        min_length = Len(val) >= CInt(params(0))
    End Function
    
    
    Function max_length(val, params)
        max_length = Len(val) <= CInt(params(0))
    End Function
    
    
    Function alphanumeric(val)
        Dim rgx : Set rgx = New RegExp
        rgx.Pattern = "^[A-Za-z0-9]+$"
        alphanumeric = rgx.Test(val)
    End Function
    
    
    Function validate(val, criterion)
    
        Dim arrCriterion : arrCriterion = Split(criterion, "|")
        Dim criteria
    
        validate = True
    
        For Each criteria in arrCriterion
    
            Dim paramListPos : paramListPos = InStr(criteria, "(")
    
            If paramListPos = 0 Then
                validate = GetRef(criteria)(val)
            Else
                Dim paramList
                paramList = Split(Mid(criteria, paramListPos + 1, Len(criteria) - paramListPos - 1), ",")
                criteria = Left(criteria, paramListPos - 1)
                validate = GetRef(criteria)(val, paramList)
            End If
            If Not validate Then Exit For
        Next
    
    End Function
    

    在提供了这个之后,我不得不说,如果您熟悉 PHP,那么 JScript 将是服务器上的更好选择。在 Javascript 中,您可以调用这样的方法:-

    function test(val) { return val + " has been tested"; )
    var myvar = "test"
    Response.Write(this[myvar]("Thing"))
    

    【讨论】:

      【解决方案2】:

      如果您在谈论 VBScript,它没有那种功能。 (至少据我所知)我可能会这样尝试:

      Select myvar
         case "test":
            test
      
         case "anotherSub":
            anotherSub
      
         else
            defaultSub
      
      end select
      

      我写 VBScript 已经有一段时间了(谢天谢地),所以我不确定我的语法有多好。

      编辑-另一种策略

      出于安全原因,我个人会执行上述操作。但是,如果您绝对不喜欢它,那么您可能想尝试在您的页面上使用不同的语言。我过去在我的经典 ASP 页面(服务器端)上同时使用了 Javascript 和 VBScript,并且能够从我当前的语言调用以另一种语言声明的函数。当我想用正则表达式做一些事情但在 VBScript 中时,这特别方便。

      你可以试试

      <script language="vbscript" runat="server">
          MyJavascriptEval myvar
      </script>
      <script language="javascript" runat="server">
          function MyJavascriptEval( myExpression)
          {
              eval(myExpression);
          }
      
          /* OR
          function MyJavascriptEval( myExpression)
          {
              var f = new Function(myExpression);
              f();
          }
          */
      </script>
      

      我没有在经典的 ASP 页面中对此进行测试,但我认为它足够接近,只需稍作调整即可使用。

      【讨论】:

      • John - 你已经准确地描述了我目前的解决方案。我只是想避免感觉非常多余的 case 语句。
      【解决方案3】:

      在 ASP/VBScript 中使用“执行”语句。

      Execute "Response.Write ""hello world"""
      

      【讨论】:

        【解决方案4】:

        PHP 动态调用或创建函数的能力是导致不良编程实践的技巧。你需要解释你想要完成什么(而不是如何)并学习正确的编码方式。

        仅仅因为你可以做某事,并不代表它是正确的或一个好主意。

        【讨论】:

        • 我同意它很容易被滥用,但称其为“黑客”有点强。 “动态编程”是一门合法的编程学科,只是我们中的许多人(包括我自己)更喜欢强类型和编译器检查代码的安全性。
        【解决方案5】:

        ASP 不支持这种方式的后期绑定。从更大的意义上说,你想做什么?解释一下,有人可以告诉你如何在asp中完成它。

        【讨论】:

          【解决方案6】:

          此外,您可能会考虑“客观化”验证功能。在 VB 脚本中创建类是可能的(虽然没有被广泛使用)。

          <%
          Class User
          ' declare private class variable
          Private m_userName
          
          ' declare the property
          Public Property Get UserName
            UserName = m_userName
          End Property
          Public Property Let UserName (strUserName)
            m_userName = strUserName
          End Property
          
          ' declare and define the method
          Sub DisplayUserName
            Response.Write UserName
          End Sub
          
          End Class
          %> 
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-03-28
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多