GetCallbackEventReference无法同步工作

时间:2008-09-29 03:58:01

标签: asp.net callback webforms asp.net-3.5

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

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

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

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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,此参数实际上不会同步执行请求,但要确保请求已排队并且在任何给定时间都只有一个正在进行。效果几乎相同,除了最终用户在请求进行期间仍可以使用浏览器用户界面,并且如果服务器无法响应或网络连接中断,他将不必终止该进程。

MSDN page确认了这一点:

  

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