Как вы вызываете метод из переменной в ASP Classic? - PullRequest
2 голосов
/ 03 декабря 2008

Например, как мне запустить 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")

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

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

Ответы [ 6 ]

6 голосов
/ 05 декабря 2008

Вы можете достичь этого в 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 голосов
/ 03 декабря 2008

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

Select myvar
   case "test":
      test

   case "anotherSub":
      anotherSub

   else
      defaultSub

end select

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

РЕДАКТИРОВАТЬ-Другая стратегия

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

1 голос
/ 06 декабря 2008

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

Execute "Response.Write ""hello world"""
1 голос
/ 03 декабря 2008

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

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

0 голосов
/ 05 декабря 2008

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...