2008-12-02 14 views
2

Например, как я могу запустить me.test ниже?Как вы вызываете метод из переменной в ASP Classic?

myvar = 'test' 
me.myvar 

ASP ищет метод «myvar» и не находит его. В PHP я могу просто сказать $ me -> $ myvar, но синтаксис ASP не отличает переменные и методы. Предложения?

В связи с этим существует функция method_exists в ASP Classic?

Заранее спасибо!

EDIT: Я пишу класс проверки и хотел бы вызвать список методов через строку с разделителями, связанную с трубой.

Так, например, для проверки поля имени, я бы назвал:

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

Мне нравится идея иметь одну строку, которая показывает все пути, данное поле проверяемых. И каждая секция, разделенная на строку, представляет собой имя метода.

Если у вас есть предложения по улучшению настройки, я все уши!

ответ

6

Вы можете добиться этого в 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") 

Пошлет «Вещь была протестирована» клиенту.

Так вот ваше требование Validate с помощью 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")) 
0

ASP не поддерживает позднюю привязку таким образом. Что вы пытаетесь сделать в более широком смысле? Объясните это, и кто-то может показать вам, как выполнить его в asp.

2

Если вы говорите о VBScript, у него нет такой функциональности. (По крайней мере, не к моему знанию) я мог бы попытаться это так:

Select myvar 
    case "test": 
     test 

    case "anotherSub": 
     anotherSub 

    else 
     defaultSub 

end select 

Это было некоторое время, так как я написал VBScript (слава богу), так что я не уверен, насколько хорошо мой синтаксис.

EDIT-Другая стратегия

Лично я хотел бы сделать выше, по соображениям безопасности. Но если вам это совсем не нравится, вы можете попробовать использовать разные языки на своей странице. В прошлом я использовал Javascript AND VBScript на моих классических страницах ASP (на стороне сервера) и смог вызывать функции, объявленные на другом языке с моего текущего языка. Это особенно удобно, когда я хотел что-то сделать с регулярными выражениями, но был в 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 странице, но я думаю, что это достаточно близко, что он будет работать с небольшими ухищрениями.

+0

John - Вы точно описали мое текущее решение. Я просто хотел бы избежать утверждения дела, которое кажется очень излишним. – 2008-12-03 02:00:36

1

Возможность PHP динамически вызывать или создавать функции - это хаки, которые приводят к плохой практике программирования. Вам нужно объяснить, что вы пытаетесь выполнить (а не как), и узнать правильный способ кодирования.

Просто потому, что вы можете что-то сделать, не делает это правильно или хорошая идея.

+1

Я бы согласился с тем, что это очень легко злоупотреблять, но называть его «взломом» немного сильным. «Динамическое программирование» - это законная дисциплина, связанная с программированием, просто многие из нас (включая меня) предпочитают безопасность кода с сильной типизацией и компилятором. – 2008-12-03 01:16:10

0

Кроме того, вы можете подумать о «объективизации» функций проверки. Создание классов возможно (хотя и не широко используется) в 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 
%> 
1

Используйте инструкцию «Выполнение» в ASP/VBScript.

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