ASP Classicの変数からメソッドを呼び出す方法
-
22-07-2019 - |
質問
たとえば、以下で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")
特定のフィールドが検証されるすべての方法を示す単一の行を持つというアイデアが好きです。そして、文字列の各パイプ区切りセクションはメソッドの名前です。
より良いセットアップのための提案があれば、私はすべて耳です!
解決
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")
「テスト済み」を送信します;クライアントへ。
これは、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]+function test(val) { return val + " has been tested"; )
var myvar = "test"
Response.Write(this[myvar]("Thing"))
quot;
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では、次のようなメソッドを呼び出すことができます:-
<*>他のヒント
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ページでこれをテストしませんでしたが、マイナーな調整で機能するのに十分近いと思います。
PHPが動的に関数を呼び出したり作成したりする能力は、プログラミングの質の悪さをもたらすハッキングです。達成しようとしていることを(方法ではなく)説明し、コーディングの正しい方法を学ぶ必要があります。
あなたが何かをすることができるからといって、それを正しくしないか、良い考えではありません。
「実行」を使用します; ASP / VBScriptのステートメント。
Execute "Response.Write ""hello world"""
ASPは、この方法で遅延バインディングをサポートしません。より広い意味で、あなたは何をしようとしていますか?それを説明してください、そして誰かがaspでそれを達成する方法をあなたに示すことができます。
さらに、「客観化」を検討することもできます。検証機能。 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
%>