关于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 }
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 }
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
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
<h3>
心静似高山流水不动,心清若巫峰雾气不沾。
</h3>
心静似高山流水不动,心清若巫峰雾气不沾。
</h3>