Ошибка класса не определена при смешивании языков сценариев - PullRequest
0 голосов
/ 15 февраля 2012

следующий код:

<%
Response.Write("VB comes second!")

'page1()
Dim p
Set p = New Page
%>

<script language = "Python" runat="server">
Response.Write("Python comes first!")

class Page:
    def display_top(self):
        Response.Write("""
        <html>
        """)

    def display_body(self, body_text):
        Response.Write("<body>"+body_text+"</body>")

    def display_bottom(self):
        Response.Write("""
        </html>
        """)

def page1():
    p = Page()
    p.display_top()
    p.display_body("This is my body!")
    p.display_bottom()
</script>

выдает ошибку:

Error Type:
Microsoft VBScript runtime (0x800A01FA)
Class not defined: 'Page'
/website/index.asp, line 6

Но почему?

Если я вызываю функцию page1 () из VBScript, то она работает как положено.

Спасибо

Barry

РЕДАКТИРОВАТЬ 1:

Это:

<script language = "Python" runat="server">
class Page:
    def display_top(self):
        Response.Write("<html>")
</script>

<%
Dim p
Set p = server.createobject("Page")
%>

выдает ошибку:

Неверная строка класса

Если я использую:

Set p = New Page

вместо этого, тогда я получаю:

Класс не определен: 'Page'

Ответы [ 5 ]

1 голос
/ 16 февраля 2012

Я не могу найти точный источник для этого, но я почти уверен, что ключевое слово VBScript New можно использовать только для создания экземпляров классов, определенных в VBScript, с помощью ключевого слова Class. Вместо этого вы должны написать «фабричную» функцию в Python, которая будет возвращать новый Page объект. Затем вы можете вызвать эту функцию из VBScript.

Я не знаю Python, но вот пример с VBScript и JScript для иллюстрации:

<%
Dim p
Set p = makePage("hello")
Response.Write p.foo
%>

<script language="JScript" runat="server">
function Page(foo) {
    this.foo = foo;
}

function makePage(foo) {
    return new Page(foo);
}
</script>
1 голос
/ 16 февраля 2012
Proof that the class defined in one script block is reachable from another script block; 

<%
Response.Write "VBScript Here - 1 <p>"
hello()

apple.color = "reddish"
response.write (apple.getInfo())

%>

<script language=JavaScript runat=Server>
    Response.Write("Javascript here - 2 <p>");
    function hello()
    {
        Response.Write("Hello from JS <p>");
    }


    var apple = {
        type: "macintosh",
        color: "red",
        getInfo: function () {
            return this.color + ' ' + this.type + ' apple' + '<p>';
        }
    }


</script>

<%
    Response.Write("VBScript here - 3 <p>")
%>


<script language=JavaScript runat=Server>
    Response.Write("Javascript here - 4 <p>");  
</script>

<%
    Response.Write("VBScript here - 5 <p>")
%>


will give you this 
Javascript here - 2
Javascript here - 4
VBScript Here - 1
Hello from JS
reddish macintosh apple
VBScript here - 3
VBScript here - 5
1 голос
/ 15 февраля 2012

Вы попали в ограничение двигателя asp прямо здесь.

Код в <script runat=server> блоках может выполняться в разное время.

Порядок выполнения серверного сценария

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

Все встроенные скрипты должны быть на одном языке, а именно на языке, указанном в директиве @ вверхустраницы.Следовательно, вы не можете смешивать языки сценариев во встроенном сценарии.

"Но подождите!"Вы могли бы сказать.Теоретически возможно поместить встроенный скрипт в элемент <SCRIPT>, то есть иметь скрипт в элементе, который не является частью функции или подпрограммы, как в следующем примере:

<% Response.Write("Some inline script<BR>")%>
<SCRIPT LANGUAGE="VBScript" RUNAT="Server">
    Response.Write("Script in a SCRIPT element<BR>")
</SCRIPT>

Да, вы можете сделать это.* Тем не менее, вы находитесь в зависимости от порядка выполнения процессора IIS ASP. *

Упорядочение блоков сценариев

Когда выявляются языками смешения, порядок, в котором блоки <SCRIPT> появляются на странице, может повлиять на их правильную работу.Рассмотрим этот простой случай встроенного сценария VBScript, вызывающего функцию, написанную на JScript:

<SCRIPT LANGUAGE="VBScript">
    ' Calls a JScript function
    aNumber = 2
    doubledNumber = doubleMe(aNumber)
    document.write("The answer is " & doubledNumber)
</SCRIPT>

<SCRIPT LANGUAGE="JavaScript">
    function doubleMe(aNumber){
        return aNumber * 2;
    }
</SCRIPT>

Это не будет работать.Более конкретно, оператор document.write записывает пустую строку на страницу.Зачем?Поскольку во время обработки блока VBScript следующий блок JScript <SCRIPT> еще не был прочитан, проанализирован и доступен для страницы.Когда браузер обрабатывает блоки скриптов на странице, он работает сверху вниз.

В этом случае простое изменение порядка блоков скриптов решает проблему.И на самом деле, этот тип сценария не так уж и распространен - ​​по большей части, <SCRIPT> блоки содержат функции и подпрограммы, которые не будут вызываться до тех пор, пока страница не будет полностью загружена и все элементы не будут доступны.Тем не менее, вам следует помнить о том, что страницы обрабатываются линейно и что <SCRIPT> блоки на разных языках обрабатываются отдельно.

Чтобы узнать больше, посетите эту базу знаний MSDNстатья .

0 голосов
/ 16 февраля 2012

Вам необходимо изменить порядок скриптов.Когда ваш скрипт встречает вызов функции, он позволяет этому функциональному блоку находиться в любом блоке кода на странице в той же области видимости.Это не так при создании объектов.При создании объектов объектный код должен обрабатываться перед строкой создания.Сценарии для всех намерений и целей выполняются линейно.

0 голосов
/ 16 февраля 2012

Проблема в порядке исполнения.У меня не установлен Python на моем сервере.Так что я сделал для вас тест с JS vs VB - это та же проблема, о которой я говорил.Взгляните;

<%
Response.Write "VBScript Here - 1 <p>"
%>

<script language=JavaScript runat=Server>
    Response.Write("Javascript here - 2 <p>");
</script>

<%
    Response.Write("VBScript here - 3 <p>")
%>


<script language=JavaScript runat=Server>
    Response.Write("Javascript here - 4 <p>");  
</script>

<%
    Response.Write("VBScript here - 5 <p>")
%>

will give you this

Javascript here - 2
Javascript here - 4
VBScript Here - 1
VBScript here - 3
VBScript here - 5
...