GetCallbackEventReference 不同步工作

GetCallbackEventReference doesn't work synchronously

提问人:deadbug 提问时间:9/29/2008 最后编辑:Csharpdeadbug 更新时间:7/5/2018 访问量:2618

问:

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

现在,文档说第 5 个参数(见下文)控制了这一点。具体来说,当你传递 'false' 时,它应该是一个非异步调用。但是,无论它是 true 还是 false,它仍会异步处理调用。

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

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

asp.net 回调 WebForms ASP.NET-3.5

评论


答:

1赞 Javal Patel 5/3/2013 #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
0赞 Shaun 7/5/2018 #2

对于仍在使用 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 页面证实了这一点:

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