Come si chiama un metodo da una variabile in ASP Classic?
-
22-07-2019 - |
Domanda
Ad esempio, come posso eseguire me.test di seguito?
myvar = 'test'
me.myvar
ASP cerca il metodo " myvar " e non lo trova. In PHP potrei semplicemente dire $ me- > $ myvar ma la sintassi di ASP non distingue tra variabili e metodi. Suggerimenti?
Strettamente correlato a questo, esiste una funzione method_exists in ASP Classic?
Grazie in anticipo!
EDIT: sto scrivendo una classe di convalida e vorrei chiamare un elenco di metodi tramite una stringa delimitata da pipe.
Ad esempio, per convalidare un campo nome, chiamerei:
validate("required|min_length(3)|max_length(100)|alphanumeric")
Mi piace l'idea di avere una sola riga che mostri tutti i modi in cui un determinato campo viene convalidato. E ogni sezione delimitata da pipe della stringa è il nome di un metodo.
Se hai suggerimenti per una migliore configurazione, sono tutto orecchi!
Soluzione
Puoi farlo in VBScript usando la funzione 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")
Invierà " La cosa è stata testata " al cliente.
Quindi ecco il tuo requisito valido usando 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
Detto questo, devo dire che se hai familiarità con PHP, JScript sarebbe una scelta migliore sul server. In Javascript puoi chiamare un metodo come questo: -
<*>Altri suggerimenti
Se stai parlando di VBScript, non ha quel tipo di funzionalità. (almeno non a mia conoscenza) Potrei provarlo in questo modo:
Select myvar
case "test":
test
case "anotherSub":
anotherSub
else
defaultSub
end select
È da un po 'che non scrivo VBScript (grazie a dio), quindi non sono sicuro di quanto sia buona la mia sintassi.
EDIT-Un'altra strategia
Personalmente, farei quanto sopra, per motivi di sicurezza. Ma se non ti piace assolutamente, potresti provare a usare lingue diverse sulla tua pagina. In passato ho usato sia Javascript che VBScript sulle mie pagine ASP classiche (entrambi lato server) e sono stato in grado di chiamare le funzioni dichiarate nell'altra lingua dalla mia lingua corrente. Ciò è stato particolarmente utile quando volevo fare qualcosa con le espressioni regolari, ma era in VBScript.
Puoi provare qualcosa del genere
<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>
Non l'ho provato in una classica pagina ASP, ma penso che sia abbastanza vicino da funzionare con piccole modifiche.
La capacità di PHP di chiamare o creare dinamicamente funzioni sono hack che portano a pratiche di programmazione scadenti. Devi spiegare cosa stai cercando di realizzare (non come) e imparare il modo corretto di codificare.
Solo perché puoi fare qualcosa, non farlo nel modo giusto o una buona idea.
Utilizza " Esegui " istruzione in ASP / VBScript.
Execute "Response.Write ""hello world"""
ASP non supporta l'associazione tardiva in questo modo. Cosa stai cercando di fare, in senso lato? Spiegalo e qualcuno può mostrarti come realizzarlo in asp.
Inoltre, potresti considerare " oggettivare " la funzionalità di validazione. Creare classi è possibile (anche se non ampiamente utilizzato) in VB Script.
<%
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
%>