2

たとえば、以下のme.testを実行するにはどうすればよいですか?

myvar = 'test'
me.myvar

ASPはメソッド"myvar"を探しますが、見つかりません。PHPでは、単純に$ me-> $ myvarと言うことができますが、ASPの構文では変数とメソッドを区別しません。提案?

これに密接に関連して、ASPクラシックにmethod_exists関数はありますか?

前もって感謝します!

編集:検証クラスを作成していて、パイプで区切られた文字列を介してメソッドのリストを呼び出したいと思います。

たとえば、名前フィールドを検証するには、次のように呼び出します。

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

特定のフィールドが検証されているすべての方法を示す1行にするというアイデアが好きです。また、文字列の各パイプ区切りセクションは、メソッドの名前です。

より良いセットアップの提案があれば、私はすべての耳です!

4

6 に答える 6

7

GetRef関数を使用して、VBScript でこれを実現できます。

Function Test(val)
  Test = val & " has been tested"
End Function

Dim myvar : myvar = "Test"
Dim x : Set x = GetRef(myvar)
Response.Write x("Thing")

クライアントに「Thing has been testing」を送信します。

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"))
于 2008-12-05T17:54:37.773 に答える
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ページではテストしていませんが、微調整で機能するほど十分に近いと思います。

于 2008-12-02T22:21:27.553 に答える
2

ASP/VBScript で「Execute」ステートメントを使用します。

Execute "Response.Write ""hello world"""
于 2008-12-06T13:30:58.337 に答える
1

関数を動的に呼び出したり作成したりするPHPの機能は、プログラミング手法の質を低下させるハックです。何を達成しようとしているのか(方法ではなく)を説明し、正しいコーディング方法を学ぶ必要があります。

あなたが何かをすることができるという理由だけで、それを正しくしたり、良い考えにしたりすることはできません。

于 2008-12-02T22:27:05.357 に答える
0

さらに、検証機能を「客体化」することを検討することもできます。クラスの作成は(広く使用されていませんが)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
%> 
于 2008-12-05T18:14:25.440 に答える
0

ASPは、この方法で遅延バインディングをサポートしていません。より広い意味で、あなたは何をしようとしていますか?それを説明してください、そうすれば誰かがaspでそれを達成する方法をあなたに示すことができます。

于 2008-12-02T22:20:43.530 に答える