关于ICallbackEventHandler的疑问

近日,由于需要,我写了一个webcontrol,并在实现了ICallbackEventHandler,目的是根据传进来的参数进行逻辑处理,然后返回值。

我下面的例子目的是从1到5调用异步函数,然后在回调函数将1到5这几个数值相加。但是,由于调用异步函数的过程没有被阻塞,因此值一直为0.

特别注意:我在使用this.Page.ClientScript.GetCallbackEventReference(this, "argument", "callbackFunc", "context",false)的时候,最后一个参数的true或false都测试过(也就是同步异步都不行)。

由于比较急,且个人弄了很久,没个头绪,因此斗胆发到首页来,请各位高人们帮忙参谋参谋。。。拜谢先。

猛击这里下载源码->/Files/McJeremy/AjaxCountTest.rar 

源码是用vs2005+sp1创建的(ASP.NET 网站类型) 

下面是代码 :

 1 namespace Test
 2 {
 3     /// <summary>
 4     /// AjaxControl 的摘要说明
 5     /// </summary>
 6     public class AjaxControl : WebControl, ICallbackEventHandler
 7     {
 8         public AjaxControl()
 9         {
10         }
11 
12         protected override void Render(HtmlTextWriter writer)
13         {
14             writer.Write("Test tttt");
15             writer.Write(GetAjaxFunction());
16         }
17        //生成异步函数
18         private string GetAjaxFunction()
19         {
20             System.Text.StringBuilder sb = new System.Text.StringBuilder();
21             sb.Append("<script type=\"text/javascript\">");
22             sb.Append("function callServer(argument,context){");
23             sb.Append(this.Page.ClientScript.GetCallbackEventReference(this"argument""callbackFunc""context",false));
24             sb.Append("}</script>");
25             return sb.ToString();
26         }
27 
28         #region ICallbackEventHandler 成员
29 
30         private string rValue;
31 
32         public string GetCallbackResult()
33         {
34             return rValue;
35         }
36 
37         public void RaiseCallbackEvent(string eventArgument)
38         {
39             //此处不作处理,直接返回
40             rValue = eventArgument;
41         }
42 
43         #endregion
44     }
45 }

 

JS文件
 1 var envir={count:0};
 2 function callbackFunc(data,context)
 3 {
 4    envir.count+=parseInt(data,10);
 5 }
 6 
 7 window.onload=function()
 8 {
 9    //循环调用异步函数
10     for(var i=1;i<5;i++)
11     {
12         callServer(i,'');
13     }
14         
15         //此处不等callServer执行完成后,就执行了。导致envir.count为0
16         //而按设想,envir.count的值应该是1+2+3+4 = 10
17     alert(envir.count);
18 }

 

最终调用的default.aspx:

 

 1 <%@ Page Language="C#" AutoEventWireup="true"  CodeFile="Default.aspx.cs" Inherits="_Default" %>
 2 
 3 <%@ Register Assembly="ClassLibrary" Namespace="Test" TagPrefix="cc1" %>
 4 
 5 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 6 
 7 <html xmlns="http://www.w3.org/1999/xhtml" >
 8 <head runat="server">
 9     <title>无标题页</title>
10     <script type="text/javascript" src="JScript.js">
11     
12     </script>
13 </head>
14 <body>
15     <form id="form1" runat="server">
16     <div>
17         <cc1:AjaxControl ID="AjaxControl1" runat="server" />       
18     </div>
19     </form>
20 </body>
21 </html>
22 

 

 

 

posted @ 2010-06-18 09:12  mcjeremy  阅读(1893)  评论(10编辑  收藏  举报
------------------------------------ 心静似高山流水不动,心清若巫峰雾气不沾 ------------------------------------