介绍
现在ASP.Net AJAX Framework已经发布了,可以方便的编写拥有AJAX功能的Web程序,本文介绍的方法是应用ICallbackEventHandler接口实现的AJAX调用。优点是不需要安装ASP.NET AJAX Framework,缺点是实现起来比较繁琐。
注册javascript函数。
首先我们要在Page_Load函数中注册一个javascript函数,要想注册一个javascript函数,我们首先要获取ClientScriptManager
ClientScriptManager manager
=
this
.Page.ClientScript;
然后获取一个CallbackReference
string
callbackRef
=
manager.GetCallbackEventReference(
this
,
"
args
"
,
"
OnComplete
"
,
"
ctx
"
,
"
OnMyError
"
,
true
);
这将得到一个javascript的代码段,在我的机器上的值是
"WebForm_DoCallback('__Page',args,OnComplete,ctx,OnMyError,true)"
也就是ASP.NET为我们生成的一个回调函数。这5个参数和GetCallbackEventReference的5个参数相对应。我们可以将这个代码片断放到我们自己定义的一个函数里面,马上就可以看到怎么使用了
protected
void
Page_Load(
object
sender, EventArgs e)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
if (!this.Page.IsCallback)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
ClientScriptManager manager = this.Page.ClientScript;
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
string callbackRef = manager.GetCallbackEventReference(this, "args", "OnComplete", "ctx", "OnMyError", true);
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
StringBuilder sb = new StringBuilder();
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
sb.AppendLine("function MyCallBack(args, ctx)");
sb.AppendLine("{");
sb.AppendLine(" " + callbackRef + ";");
sb.AppendLine("}");
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
sb.AppendLine("function OnComplete(args, ctx)");
sb.AppendLine("{");
sb.AppendLine(" document.getElementById('" + Panel1.ID + "').innerHTML = args;");
sb.AppendLine("}");
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
sb.AppendLine("function OnMyError(err)");
sb.AppendLine("{");
sb.AppendLine(" alert('error=' + err);");
sb.AppendLine("}");
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
manager.RegisterClientScriptBlock(base.GetType(), "CallBackFunction", sb.ToString(), true);
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
}
}
我声明了3个Javascript函数,MyCallBack, OnComplete,OnMyError。MyCallBack包装了一下ASP.NET返回的Javascript代码片断,在我的机器上展开就是:
function
MyCallBack(args, ctx)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
WebForm_DoCallback('__Page',args,OnComplete,ctx,OnMyError,true)
}
OnComplete在后台成功返回数据后调用,OnMyError在发生错误时调用。
实现接口ICallbackEventHandler
使后台的页面类实现接口ICallbackEventHandler,ICallbackEventHandler接口有两个方法RaiseCallbackEvent和GetCallbackResult。对于每个javascript发过来的ajax调用,首先会调用Page_Load方法,调用时this.Page.IsCallBack为true. 然后会调用RaiseCallbackEvent方法,RaiseCallbackEvent参数为一个string,其值就是javascript调用MyCallBack函数时传入的值。最后调用GetCallbackResult将结果返回给浏览器端。GetCallbackResult的返回值,就是OnComplete函数的第一个参数。
到这里一个完整的调用就结束了。
建立程序
首先在VS2005中建立一个ASP.NET的Web Site, 在页面上添加一个HtmlButton和一个Panel,然后为HtmlButton添加一个onclick处理函数MyCallBack(), 添加完的HTML文件如下:
<%
...
@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default"
%>
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
<!
DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"
>
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
<
html
xmlns
="http://www.w3.org/1999/xhtml"
>
<
head
runat
="server"
>
<
title
>
Untitled Page
</
title
>
</
head
>
<
body
>
<
form
id
="form1"
runat
="server"
>
<
div
>
<
br
/>
<
input
id
="Button1"
style
="width: 172px"
type
="button"
onclick
="MyCallBack()"
value
="Get Date"
/><
br
/>
<
br
/>
<
asp:Panel
ID
="Panel1"
runat
="server"
>
</
asp:Panel
>
</
div
>
</
form
>
</
body
>
</
html
>
这是后台的C#代码
using
System;
using
System.Text;
using
System.Web.UI;
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
public
partial
class
_Default : Page, ICallbackEventHandler
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
private string mTime = "None";
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
public void RaiseCallbackEvent(string eventArgument)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
mTime = DateTime.Now.ToString();
}
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
public string GetCallbackResult()
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
return mTime;
}
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
protected void Page_Load(object sender, EventArgs e)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
if (!this.Page.IsCallback)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
ClientScriptManager manager = this.Page.ClientScript;
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
string callbackRef = manager.GetCallbackEventReference(this, "args", "OnComplete", "ctx", "OnMyError", true);
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
StringBuilder sb = new StringBuilder();
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
sb.AppendLine("function MyCallBack(args, ctx)");
sb.AppendLine("{");
sb.AppendLine(" " + callbackRef + ";");
sb.AppendLine("}");
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
sb.AppendLine("function OnComplete(args, ctx)");
sb.AppendLine("{");
sb.AppendLine(" document.getElementById('" + Panel1.ID + "').innerHTML = args;");
sb.AppendLine("}");
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
sb.AppendLine("function OnMyError(err)");
sb.AppendLine("{");
sb.AppendLine(" alert('error=' + err);");
sb.AppendLine("}");
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
manager.RegisterClientScriptBlock(base.GetType(), "CallBackFunction", sb.ToString(), true);
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
}
}
}