Вызов функции VB.NET WebMethod из Javascript

У меня есть функция VB.NET, которая выглядит так:

<WebMethod()> _
Public Shared Function AuthenticateUser(ByVal UserInfo As String, ByVal Password As String) As Boolean
    Dim UserName As String

    'Just in case
    AuthenticateUser = False

    'Extract the user name from the user info cookie string
    UserName = Globals.GetValueFromVBCookie("UserName", UserInfo)

    'Now validate the user
    If Globals.ValidateActiveDirectoryLogin("Backoffice", UserName, Password) Then
        AuthenticateUser = True
    End If

End Function

Я пытаюсь вызвать его из javascript следующим образом:

function DeleteBatchJS()
{if (confirm("Delete the ENTIRE batch and all of its contents? ALL work will be lost."))
     var authenticated = PageMethods.AuthenticateUser(get_cookie("UserInfo"), prompt("Please enter your password"))
     if (authenticated == true)
           {{var completed = PageMethods.DeleteBatchJSWM(get_cookie("UserInfo"));
            window.location = "BatchOperations.aspx";
            alert("Batch Deleted.");}}}

Он вызывает функцию, но не возвращает значение. При просмотре кода моя функция VB срабатывает (она будет возвращать true, если введен правильный пароль), но значение «аутентифицированного» javascript остается «неопределенным». Это похоже на то, что вы не можете возвращать значения из функций VB в javascript.

я тоже пробовал

if PageMethods.AuthenticateUser("UserName", "Password")
   {
     //Stuff
   }

Но все равно не повезло.

Что я делаю не так?

Спасибо,

Джейсон


person Community    schedule 12.07.2011    source источник
comment
примечание: я бы никогда не запрашивал такой пароль.   -  person Joel Coehoorn    schedule 12.07.2011
comment
@Joel - кодировка пароля существует для простоты. Настоящий код немного сложнее   -  person    schedule 12.07.2011


Ответы (1)


Веб-методы вызываются с использованием AJAX, т. е. асинхронно, т. е. вам нужно дождаться завершения метода, прежде чем использовать результаты, т. е. вы должны использовать успешные обратные вызовы:

function DeleteBatchJS() {
    var shouldDelete = confirm('Delete the ENTIRE batch and all of its contents? ALL work will be lost.');
    if (!shouldDelete) {
        return;
    }

    var password = prompt('Please enter your password');
    var userInfo = get_cookie('UserInfo');
    PageMethods.AuthenticateUser(
        userInfo, 
        password,
        function(result) {
            // It's inside this callback that you have the result
            if (result) {
                PageMethods.DeleteBatchJSWM(
                    userInfo,
                    function(data) {
                        // It's inside this callback that you know if
                        // the batch was deleted or not
                        alert('Batch Deleted.');
                        window.location.href = 'BatchOperations.aspx';
                    }
                );
            }
        }    
    );
}
person Darin Dimitrov    schedule 12.07.2011
comment
Вы также можете передать адрес функции и функции ошибки. - person spacemonkeys; 12.07.2011
comment
@Darin: я думаю, вы упускаете из виду .d, что может быть реальной проблемой ОП. - person naveen; 12.07.2011
comment
@naveen, нет, .d нет. Это когда вы используете PageMethods с jQuery. Автоматически созданные функции ASP.NET удаляют его автоматически. - person Darin Dimitrov; 12.07.2011
comment
@Darin: это работает ровно в половине случаев. Обычно после 4-й или 5-й попытки он начинает работать (на 4-5 раз, когда снова не работает). - person ; 13.07.2011
comment
@Json, может ли это быть из-за того, что ваш сервер PageMethod выдает исключение в половине случаев? Пробовали ставить точки останова? Также вы пытались анализировать запросы/ответы AJAX с помощью FireBug? - person Darin Dimitrov; 13.07.2011
comment
@Darin - Кажется, когда я просматриваю веб-метод, весь этот код срабатывает нормально. Похоже, мне придется узнать о FireBug. Спасибо! - person ; 13.07.2011