2

我有一个利用框架 Page.ClientScript.GetCallbackEventReference() 方法的 ASP.NET 3.5 WebForm,我希望一些调用是同步的。

现在,文档说第五个参数(见下文)控制它。具体来说,当您传递“false”时,它应该是一个非异步调用。但是,无论是真还是假,它仍然异步处理调用。

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

是否有解决方法,或者我做错了什么?

4

2 回答 2

1

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
于 2013-05-02T18:27:18.040 回答
0

对于仍在使用 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 消息来源的最后一条评论说:

这实际上是设计使然。为了不阻塞浏览器的 UI,这个参数实际上并没有同步请求,而是确保请求排队并且在任何给定时间只有一个在进行。效果几乎相同,除了最终用户在请求进行时仍然可以使用浏览器 UI,并且如果服务器无法响应或网络连接中断,他不必终止进程。

MSDN 页面证实了这一点:

在回调场景中同步发送数据时,同步回调会立即返回,不会阻塞浏览器。浏览器中不能同时执行两个同步回调回调。如果第二个同步回调在当前未决时触发,则第二个同步回调取消第一个,只有第二个回调会返回。

于 2018-07-05T07:39:48.320 回答