ASP
NET
Callback 使得ASP
NET Server端控件能够调用服务端的方法而不需要执行一个完整的Postback过程
也就是说使得Server端控件可以很好的支持Ajax
Callback不同于Postback之处在于向服务器发送请求时只有ViewState和用户自定义信息被发送到服务器端
请求完毕后
只返回用户自定义结果
而不会从Render页面
GridView控件正是使用了这个技术来实现无刷新的分页及排序功能那么它是如何实现的哪我们又如何在自定义控件中添加该功能哪?本文将会简单地阐述如何使用ASPNET Callback来实现Ajax
ICallbackEventHandler 接口
ASPNET Server端控件可以通过实现ICallbackEventHandler 接口来接受客户端Callback事件
ICallbackEventHandler 接口声明
public interface ICallbackEventHandler
{
string GetCallbackResult();
void RaiseCallbackEvent(string eventArgument);
}
RaiseCallbackEvent负责处理客户端回调事件其中方法参数eventArgument是客户端脚本在触发Callback时提供的该方法将会依赖于eventArgument参数来进行处理
GetCallbackResult则负责将处理结果作为String返回给客户端脚本当Callback完成后客户端脚本将会根据得到的处理结果进行页面局部更新
CallbackEventReference
那么怎么样才能注册一段客户端脚本来触发Callback还需要做些什么哪?
ClientScriptManager类用于管理Web页面中的客户端脚本提供了一系列的方法来注册脚本并且还可以获得指定客户端脚本函数的引用通过ClientScriptManager类的GetCallbackEventReference方法我们可以获取一个对客户端函数的引用当该函数在客户端被调用时将启动一次客户端回调
GetCallbackEventReference方法声明
public string GetCallbackEventReference (
Control control
string argument
string clientCallback
string context
string clientErrorCallback
bool useAsync
)
第一个参数指的是实现ICallbackEventHandler接口的服务器端控件
第二个参数将被传递给在服务器端执行的RaiseCallbackEvent方法它可以是一个JavaScript函数调用表达式
第三个参数是一个JavaScript函数名在Callback完成后该函数将被调用同时服务器端函数GetCallbackResult的执行结果也将作为这一个函数的参数
第四个参数是当前执行的Callback的上下文这个参数也可以是一个JavaScript函数调用表达式
第五个参数是一个JavaScript函数名在Callback执行的过程中如果有错误产生该函数将被调用
第六个参数是一个Bool值来确定当前Callback应该被同步执行还是异步执行
获取这个Callback客户端函数的引用之后我们可以注册一个新的客户端函数来调用它然后再客户端就可以通过新注册的函数来进行Callback了
.示例
我们通过一个简单的例子来剖析ASPNET Callback的整个执行过程
public class MyControl : WebControl ICallbackEventHandler
{
private const string Script = function onCallbackComplete(result){ \n +
var element = documentgetElementById(%ID%); \n +
if(element != null) \n +
elementinnerHTML = result;} \n;
private const string Script = function onCallbackError(){ \n +
var element = documentgetElementById(%ID%); \n +
if(element != null) \n +
elementinnerHTML = error;} \n;
public string GetCallbackResult()
{
return Callback result;
}
public void RaiseCallbackEvent(string eventArgument)
{
}
public override void RenderBeginTag(HtmlTextWriter writer)
{
writerAddAttribute(HtmlTextWriterAttributeOnclick DoClientCallBack());
baseRenderBeginTag(writer);
writerWrite(My Callback control);
}
protected override void OnPreRender(EventArgs e)
{
//Define callback references
string callbackRef = thisPageClientScriptGetCallbackEventReference(
this onCallbackComplete null onCallbackError true);
// Register script blocks will perform call to the server
thisPageClientScriptRegisterClientScriptBlock(
thisGetType() DoClientCallBack
function DoClientCallBack() { + callbackRef + } \n true
);
// Register other scripts
thisPageClientScriptRegisterClientScriptBlock(
thisGetType() onCallbackComplete
ScriptReplace(%ID% thisClientID) true);
thisPageClientScriptRegisterClientScriptBlock(
thisGetType() onCallbackError
ScriptReplace(%ID% thisClientID) true);
baseOnPreRender(e);
}
将上面的写好的控件放到一个Page上在Runtime 当点击该控件的时候便会执行一次Callback并且更新控件内容
执行顺序
)this
style
width=
;
twffan=
done
>图
其中WebForm_DoCallback和WebForm_CallbackComplete是微软JavaScript库中的方法
ASPNET Callback提供了一种简单的方法来使得ASPNET Server段控件可以支持AJAX其本身可以看作是一种轻量级的Postback
全文完
[更新 ]
关于构建XMLHttpRequest时设置useAsync参数为True和False的区别我摘录了MSDN的解释
bAsync Optional
Variant that specifies true for asynchronous operation (the call returns immediately) or false for synchronous operation If true assign a callback handler to the onreadystatechange property to determine when the call has completed If not specified the default is true
When bAsync is set to false send operations are synchronous and Windows Internet Explorer does not accept input or produce output while send operations are in progress Therefore this setting should not be used in situations where it is possible for a user to be waiting on the send operation to complete
注意黑体字部分另外还有一点区别就是当这次请求是同步的时候是没有办法Cancel的也就是说只有在bAsync为True的时候XmlHttpRequest对象的Abort方法才会生效