如何让ICallbackEventHandler接口的js回调方法同步执行???

游北亮
博客专家认证
2008-05-22 03:06:36
下面的代码第一次点击按钮时,总是弹出undefined,第二次以上才会弹出0;
请问怎么才能让代码第一次就弹出0呢?
GetCallbackEventReference的最后一个参数无论是true,还是false,都不起作用,

一个简单的ICallbackEventHandler实现示例:
<%@ Page language="c#" %>
<%@ Implements Interface="System.Web.UI.ICallbackEventHandler" %>
<html>
<head>
<script language="C#" runat="server">
// 接口实现
public string GetCallbackResult() {
return "0";
}
public void RaiseCallbackEvent(string eventArgument) { }
</script>

<script type="text/javascript">
var flg;
function CallServer(){
var arg = "abc";
<%=ClientScript.GetCallbackEventReference(this, "arg", "JsRecieve", null, null, true) %>;
}
function JsRecieve(ret){
flg = ret;
}
function SubmitCheck(){
CallServer();
alert(flg);// 第一次运行,这里总是弹出undefined
}
</script>
</head>
<body>
<form runat="server">
<input type="button" onclick="SubmitCheck();" value="test">
</form>
</body>
</html>
...全文
191 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
游北亮 2008-05-29
  • 打赏
  • 举报
回复
下午无答案结帖了
游北亮 2008-05-28
  • 打赏
  • 举报
回复
顶,明天结帖
游北亮 2008-05-27
  • 打赏
  • 举报
回复
自己再顶,GetCallbackEventReference方法的最后一个参数又有什么作用呢?

再过2天,没人回答时,无答案结了。
游北亮 2008-05-26
  • 打赏
  • 举报
回复
汗一个楼上的,答非所问!!!

算了,自己单步调试了一下,发现微软封装的函数里对xmlhttp的open里固定写为true
下面是微软封装的js函数的部分内容

if (setRequestHeaderMethodExists) {
xmlRequest.onreadystatechange = WebForm_CallbackComplete;
callback.xmlRequest = xmlRequest;
xmlRequest.open("POST", theForm.action, true);// 最后一个参数为true,表示异步执行回调
xmlRequest.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
xmlRequest.send(postData);
return;
}


正因如此,所以使用ICallbackEventHandler接口,不可能实现同步执行,只能是异步执行

还是那个疑问:GetCallbackEventReference方法的最后一个参数又有什么作用呢?
oyjd614 2008-05-26
  • 打赏
  • 举报
回复
给楼主一个简单的例子:

public partial class ClientCallbacks : System.Web.UI.Page,ICallbackEventHandler
{
protected string txtUserInfo; //用户基本信息

protected void Page_Load(object sender, EventArgs e)
{
//动态注册JavaScript
String cbReference = Page.ClientScript.GetCallbackEventReference(this, "arg", "ReceiveServerData", "context");
String callbackScript;
callbackScript = "function CallServer(arg, context)" + "{ " + cbReference + "} ;";
Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "CallServer", callbackScript, true);
}

//引发Callback事件处理
public void RaiseCallbackEvent(string txtFirstName)
{
if (txtFirstName != null)
{
SqlConnection conn = new SqlConnection("data source=.;initial catalog=Northwind;Integrated Security=True");
conn.Open();

SqlCommand cmd = new SqlCommand("select EmployeeID,FirstName,City,Address from Employees where FirstName=@FirstName", conn);
cmd.Parameters.Add("@FirstName", SqlDbType.NVarChar, 10).Value = txtFirstName;
SqlDataReader dr = cmd.ExecuteReader();

if (dr.Read())
{
txtUserInfo = "员工代号:" + dr["EmployeeID"] + " ,";
txtUserInfo += "姓名:" + dr["FirstName"] + " ,";
txtUserInfo += "居住城市:" + dr["City"] + " ,";
txtUserInfo += "地址:" + dr["Address"].ToString().Replace("\r\n","") + " ,";
txtUserInfo += "服务器查询时间:" + DateTime.Now.ToLongTimeString();
}
else
{
if (String.IsNullOrEmpty(txtFirstName))
{
txtUserInfo = "请输入姓名";
}
else
{
txtUserInfo = "查无此人!";
}
}

cmd.Dispose();
dr.Dispose();
conn.Dispose();
}
}

//返回Callback结果
public string GetCallbackResult()
{
return txtUserInfo; //返回员工基本信息
}

 <script type="text/JavaScript">
function DoSearch()
{
var txtFirstName = document.getElementById("txtUserName");
CallServer(txtFirstName.value, "");
}

function ReceiveServerData(txtUserInfo)
{
Results.innerText = txtUserInfo;
}

setInterval('DoSearch()',1000);
</script>

</head>
<body>
<form id="form1" runat="server">
<div>
姓名:<input id="txtUserName" type="text" /><br />
<span ID="Results" style="background-color: pink; width: 500px;"></span>
</div>
</form>
游北亮 2008-05-26
  • 打赏
  • 举报
回复
有没有人知道呢?还是根本就不能实现?

那么GetCallbackEventReference方法的最后一个参数又有什么作用呢?
游北亮 2008-05-24
  • 打赏
  • 举报
回复
自己再顶
游北亮 2008-05-23
  • 打赏
  • 举报
回复
没人回答???
游北亮 2008-05-23
  • 打赏
  • 举报
回复
自己顶
游北亮 2008-05-22
  • 打赏
  • 举报
回复
谢谢楼上的兄弟,问题是不能在JsRecieve里处理事件。
游北亮 2008-05-22
  • 打赏
  • 举报
回复
首先谢谢楼上的兄弟,问题是不能放在JsRecieve接收函数里。

wxg22526451 2008-05-22
  • 打赏
  • 举报
回复
    <script language="C#" runat="server">
// 接口实现
public string GetCallbackResult()
{
return "0";
}
public void RaiseCallbackEvent(string eventArgument) { }
</script>

<script type="text/javascript">
var flg;
function CallServer(){
var arg = "abc";
<%=ClientScript.GetCallbackEventReference(this, "arg", "JsRecieve", null, null, true) %>;
}
function JsRecieve(ret){
flg = ret;
alert(flg);//这句要放在这里
}
function SubmitCheck(){
CallServer();
//alert(flg);// 第一次运行,这里总是弹出undefined
}
</script>

62,074

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧