我有一个ASP.NET 3.5 WebForm,它利用框架Page.ClientScript.GetCallbackEventReference()方法,我希望一些调用是同步的。
现在,文档说第5个参数(见下文)控制了这一点。具体来说,当你传递'false'时,它应该是一个非异步调用。但是,无论它是真还是假,它仍然异步处理调用。
Page.ClientScript.GetCallbackEventReference(this, "arg", "ReceiveServerData", "context",false);
是否有解决办法或者我做错了什么?
答案 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> </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库的任何其他可怜的人,我发现了以下文章:
MS消息人士最后的评论是:
这实际上是设计使然。为了不阻止浏览器的UI,此参数实际上不会同步执行请求,但要确保请求已排队并且在任何给定时间都只有一个正在进行。效果几乎相同,除了最终用户在请求进行期间仍可以使用浏览器用户界面,并且如果服务器无法响应或网络连接中断,他将不必终止该进程。>
MSDN page确认了这一点:
在回调方案中同步发送数据时,同步回调会立即返回,并且不会阻止浏览器。浏览器中不能同时执行两个同步回调回调。如果在当前未决的同时触发了第二个同步回调,则第二个同步回调会取消第一个同步回调,只有第二个回调会返回。