ASP.NET AJAX - ScriptManagerProxy и обработка нажатий кнопок HTML - PullRequest
0 голосов
/ 10 ноября 2010

Я пытаюсь выяснить, как выполнить следующее:

  • Обрабатывать событие нажатия кнопки на стороне клиента - предотвращать обратную передачу, если результат вызова javascript равен false (например, onclick="js:return IsThisAllowed()")
  • Метод Javascript вернет true или false, в зависимости от результата вызова сгенерированного метода веб-сервиса с использованием ScriptManagerProxy

Приведенный ниже код упрощен до основных компонентов, на которые я ссылаюсь в этомвопрос.Я могу предупредить () возвращаемое значение без проблем, но у меня возникла проблема с тем, как вернуть результат вызова метода веб-службы в обработчик кнопки onclick?Поскольку функция Finish () вызывается в отдельном потоке при успешном выполнении, как я полагаю, вызова XmlHttp.send (), как я могу отправить значение ответа в качестве возвращаемого значения метода javascript?Я все об этом ошибаюсь?

Я уже много раз использовал подобный код, чтобы обновить DOM с помощью возвращаемых значений, например, внутри <div>, но никогда не приходилось беспокоиться о захвате возвращаемого значения.и используя его в моем сценарии.

Что у меня есть:

.NET-метод веб-службы (VB.NET):

<WebMethod()> _
<ScriptMethod()> _
Public Function IsAllowed() As Boolean
    Return True
End Function

.NET-код длястраница для генерации методов веб-службы AJAX и кнопка html

<asp:ScriptManagerProxy ID="ScriptManagerProxy1" runat="server">
    <Services>
        <asp:ServiceReference Path="~/WebServices/MyWebService.asmx" />
    </Services>
</asp:ScriptManagerProxy>
<asp:Button ID="_btn" runat="server" OnClientClick="js:return IsAllowed();" />

Javascript

<script type="text/javascript">
    function IsAllowed(orderid) {
        if (!processing) {
            processing = true;

            var ws = new MyWebService();
            ws.IsAllowed(Finish, Error)

            // return TRUE if call to IsAllowed returns true!!!

            return false;
        }
    }

    function Finish(result) {
        alert(result)
    }

    function Error() {
    }

</script>

Ответы [ 2 ]

2 голосов
/ 10 ноября 2010

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

Поскольку вы не знаете, когда получите ответ на вызов ws.IsAllowed, вам необходимо обработать его в ваших обратных вызовах (Finish и * 1005).*).

(Это верно, какой бы механизм AJAX вы не использовали.)

Я недостаточно знаком с AJAX на основе ScriptManager, чтобы сказать точно какчтобы сделать это, но общая идея заключается в том, что я бы перевернул его: вместо отмены события нажатия кнопки ASP.NET, я бы вызвал кнопку ASP.NET только в том случае, если вызов AJAX вернул true.

Используя jQuery, я бы сделал это, вызвав вызов AJAX с помощью обычной кнопки HTML (не веб-элемента управления ASP.NET).В обработчике успеха (эквивалент Finish) я бы вызвал кнопку ASP.NET (которую я, вероятно, скрыл), когда возвращаемое значение равно true.

0 голосов
/ 10 ноября 2010

Рассматривали ли вы использование jQuery?

$.ajax({
    type: "POST",
    contentType: "application/json; charset=utf-8",
    dataType: "json",
    url: "~/WebServices/IsAllowed.asmx/{Method Name}",
    data: ('{ whatever data is needed for decision making json serialized }'),
    success: function (msg) {
        alert(msg);
            },
    error: function (request, status, error) {
                    alert(err.Message);
                    alert(err.StackTrace);
    }
});
...