GetCallbackEventReference не работает синхронно - PullRequest
2 голосов
/ 29 сентября 2008

У меня есть ASP.NET 3.5 WebForm, которая использует метод платформ Page.ClientScript.GetCallbackEventReference (), и я хотел бы, чтобы некоторые вызовы были синхронными.

Теперь в документации сказано, что 5-й параметр (см. Ниже) контролирует это. В частности, когда вы передаете «false», это должен быть не асинхронный вызов. Однако, независимо от того, является ли оно истинным или ложным, он все равно обрабатывает вызов асинхронно.

Page.ClientScript.GetCallbackEventReference(this, "arg", "ReceiveServerData", "context",false);

Есть ли обходной путь для этого или, возможно, я делаю что-то не так?

Ответы [ 2 ]

1 голос
/ 02 мая 2013

Страница ASPX

<%@ Page Language="VB" AutoEventWireup="false" CodeFile="How-to-use-GetCallbackEventReference.aspx.vb" Inherits="How_to_use_Callback" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>How to use GetCallbackEventReference</title>
        <script type="text/javascript">
            function GetNumber() {
                UseCallback();
            }
            function GetRandomNumberFromServer(txtGetNumber, context) {
                document.forms[0].txtGetNumber.value = txtGetNumber
            }
        </script>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <input id="Button1" type="button" value="Get Random Number" onclick="GetNumber()" /><br /><br />
        <asp:TextBox ID="txtGetNumber" runat="server"></asp:TextBox>&nbsp;</div>
    </form>
</body>
</html>

Код сзади

Partial Class How_to_use_Callback
    Inherits System.Web.UI.Page
    Implements System.Web.UI.ICallbackEventHandler
    Dim CallbackResult As String = Nothing
    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        Dim cbReference As String = Page.ClientScript.GetCallbackEventReference(Me, "arg", "GetRandomNumberFromServer", "context")
        Dim cbScript As String = "function UseCallback(arg,context)" & "{" & cbReference & " ; " & "}"
        Page.ClientScript.RegisterClientScriptBlock(Me.GetType(), "UseCallback", cbScript, True)
    End Sub

    Public Function GetCallbackResult() As String Implements System.Web.UI.ICallbackEventHandler.GetCallbackResult
        Return CallbackResult
    End Function

    Public Sub RaiseCallbackEvent(ByVal eventArgument As String) Implements System.Web.UI.ICallbackEventHandler.RaiseCallbackEvent
        CallbackResult = Rnd().ToString()
    End Sub
End Class
0 голосов
/ 05 июля 2018

Для любых других бедных душ, все еще использующих библиотеку MS AJAX, я нашел следующий пост:

https://social.msdn.microsoft.com/Forums/vstudio/en-US/f4134c2e-ca04-423a-9da3-c613713a7b52/synchronous-callbacks-with-the-net-20-framework?forum=netfxjscript

Последний комментарий из источника MS гласит:

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

Страница MSDN подтверждает это:

При синхронной отправке данных в сценарии обратного вызова синхронные обратные вызовы немедленно возвращаются и не блокируют браузер. Никакие два синхронных обратного вызова не могут выполняться одновременно в браузере. Если второй синхронный обратный вызов сработает, пока он находится в режиме ожидания, второй синхронный обратный вызов отменяет первый, и возвращается только второй обратный вызов.

...