在 Anthem.NET 中,通过 XmlHttp 或 XmlHttpRequest 组件对服务器端所作的一次无刷新调用(通常是异步模式),称为一个回调(Callback)。

本文内容是对 Anthem.NET 框架自带范例代码的整理和归纳,着重小结一下在使用 Anthem.NET 进行 Ajax 开发的时候所涉及的调用流程控制相关的内容。至于控件的使用,因为逻辑简单,这里不做叙述。

在本文后,计划写一篇文章对调用流程及其编程时的可控制点做比较完备的归纳。

一、普通的调用

<%@ Register TagPrefix="anthem" Namespace="Anthem" Assembly="Anthem" %>
<anthem:Button id="button" runat="server" Text="Click Me!" />
<anthem:Label id="label" runat="server" />
<script runat="server">
void button_Click(object sender, EventArgs e) {
    label.Text = DateTime.Now.ToString();
    label.UpdateAfterCallBack = true;
}
</script>

二、在回调前后添加自定义客户端函数的执行逻辑

几个常用的属性:

PreCallBackFunction:用于定义回调前执行的函数,通常可以在这里加入确认的判断。
                     在这个函数里 return false 将会取消回调。

PostCallBackFunction:   回调后执行的函数。
TextDuringCallBack:    用于定义回调过程中控件显示的提示信息(通常是提示等待的文字)
EnabledDuringCallBack: 在回调过程中,控件是否禁用。
CallBackCancelledFunction: 如果回调被取消,则会调用这个函数。

代码例子:

<anthem:Button id="button1" runat="server" Text="Click Me!" TextDuringCallBack="Working..." EnabledDuringCallBack="false" PreCallBackFunction="button1_PreCallBack" PostCallBackFunction="button1_PostCallBack" CallBackCancelledFunction="button1_CallBackCancelled" />

<script language="javascript" type="text/javascript">
// 回调之前,可在这里取消回调
function button1_PreCallBack(button) {
    if (!confirm('Are you sure you want to perform this call back?')) {
        return false;
    }
    document.getElementById('button2').disabled = true;
}


// 回调完成后
function button1_PostCallBack(button) {
    document.getElementById('button2').disabled = false;
}

// 取消回调后
function button1_CallBackCancelled(button) {
    alert('Your call back was cancelled!');
}

</script>

注意以上这些客户端处理函数中,都可以传递 control 本身作为参数,因此在必要的情况下这些函数是可以被重用的。(比如对一组类似的控件的回发事件进行处理)

三、调用服务器页面的方法

服务器端需要做的事情:

[Anthem.Method]
public int Add(int a, int b) {
    return a + b;
}

void Page_Load() {
    Anthem.Manager.Register(this);
}

客户端:
<input id="a" size="3" value="1">
<input id="b" size="3" value="2">
<button onclick="DoAdd(); return false;" type="button">Add</button>
<input id="c" size="6">


// 参数的含义依次是:
//     服务器方法的名字,
//     方法的参数(以 js 数组形式传递),
//     服务器端方法返回结果时调用的回调函数(因为是异步模式)。
Anthem_InvokePageMethod(
    'Add',
    [document.getElementById('a').value, document.getElementById('b').value],
    function(result) {
        document.getElementById('c').value = result.value;
    }
);

调用后,在回调函数的参数中得到的 result 变量,是一个包含 value 和 error 两个属性的对象。如果在服务器端发生错误,则 value 为 null, 而 error 中包含错误数据。

四、如何处理回调时可能发生的异常

在页面中定义 Anthem_Error js 函数,则可处理所有回调时的未处理异常。

<script type="text/javascript">
function Anthem_Error(result) {
    alert('Anthem_Error was invoked with the following error message: ' + 
        result.error);
}
</script>

异常也可以在服务器端处理。只要定义下列名称的方法:

void Page_Error()
{
    Anthem.Manager.AddScriptForClientSideEval("window.location = 'http://anthem-dot-net.sf.net/'");
}

在服务器端处理有一些额外的好处,主要是可以将异常信息记录到日志.

五、页面跳转

在 Callback 的处理中,不能用 Response.Redirect 来处理页面跳转,因为这些函数是通过 js 的无刷新来调用的。代替的办法是用 Anthem.Manager 回传一段 js 给客户端去用 eval 的方式执行,从而达到页面跳转的效果(推而广之,这个 eval 的功能当然不限于跳转页面,可以干很多其他的事情)。

代码示例:

Anthem.Manager.AddScriptForClientSideEval("window.location = 'http://anthem-dot-net.sourceforge.net/';");

六、几个全局级别的客户端回调函数

我们可以在客户端定义几个特殊名字的函数,以供 Anthem 在每一次回调的前后调用。这些函数包括:
Anthem_PreCallBack(),
Anthem_CallBackCancelled(),
Anthem_PostCallBack(),

除此之外还包括前面说到的 Anthem_Error() 等。

这里典型的一个应用场景是,在每次回调开始后,我们在 Anthem_PreCallBack() 中创建一个“loading”信息的层,然后在取消(Anthem_CallBackCancelled) 或成功回调后(Anthem_PostCallBack),移除这个层。
这样可以很方便的模拟出类似 Gmail 中的加载效果。

七、回调过程中向页面添加了新的 js 脚本

这种情况下必须设定一个额外的属性:
Anthem.Manager.IncludePageScripts = true;

例子:

<script runat="server">

protected void button1_Click(object sender, EventArgs e)
{
HtmlButton button = new HtmlButton();
button.InnerText = "Now click me!"
button.Attributes["onclick"] = "ThankYou();"
placeholder1.Controls.Add(button);
placeholder1.UpdateAfterCallBack = true;
string script = @"<script type=""text/javascript"">
function ThankYou() {
alert('Thank you!');
}
</" + "script>"
#if V2
Page.ClientScript.RegisterClientScriptBlock(typeof(Page), script, script);
#else
Page.RegisterClientScriptBlock(script, script);
#endif
Anthem.Manager.IncludePageScripts = true;
}
</script>


八、PreUpdate 事件

控件在 Render 之前,如果 UpdateAfterCallBack 为 true,则会引发这个事件。
目前这个事件的用途似乎不大。

转载于:https://www.cnblogs.com/RChen/archive/2006/09/12/anthem_callback.html

使用 Anthem.NET 的常见回调(Callback)处理方式小结相关推荐

  1. (转载)使用 Anthem.NET 的常见回调(Callback)处理方式小结

    (转载)http://www.cnblogs.com/RChen/archive/2006/09/12/anthem_callback.html 使用 Anthem.NET 的常见回调(Callbac ...

  2. 使用 Anthem.NET 的常见回调(Callback)处理方式小结[转]

    转自:http://www.cnblogs.com/RChen/archive/2006/09/12/anthem_callback.html 在 Anthem.NET 中,通过 XmlHttp 或 ...

  3. java 回调(callback)函数简介.

    一, 什么是回调函数(callback) 假如类A有1个方法a(), 但是它不知道什么时候调用这个方法a(). 而类B告诉类A, 我知道什么时候调用.    那么类A就把自己交给类B(作为类B的一个成 ...

  4. Java 回调 (Callback) 接口学习使用

    文章目录 Java 回调 (Callback) 接口学习使用 1.什么是回调(Callback)? 2.Java代码示例 2.直接调用 3.接口调用 4.Lambda表达式 推荐看我的InfoQ地址, ...

  5. JavaScript基础——回调(callback)是什么?

    上篇文章<JavaScript基础--你真的了解JavaScript吗?>,我们明白了JavaScript是一个单线程.非阻塞.异步.解释性语言,清楚了什么是单线程.进程.阻塞.调用堆栈. ...

  6. TensorFlow中常见的CallBack

    文章目录 TensorFlow中常见的CallBack Tensorboard Checkpoint Earlystoping CSVLogger LearningRateScheduler 定义Ca ...

  7. Java线程间通信-回调的实现方式

    2019独角兽企业重金招聘Python工程师标准>>> Java线程间通信-回调的实现方式 Java线程间通信是非常复杂的问题的.线程间通信问题本质上是如何将与线程相关的变量或者对象 ...

  8. 为什么需要权重初始化(weight initialization)?常见的权重初始化方式有哪些?启发式权重初始化的好处?

    为什么需要权重初始化(weight initialization)?常见的权重初始化方式有哪些?启发式权重初始化的好处? 目录 为什么需要权重初始化(weight initialization)?常见 ...

  9. java outofmemory jsp_Java 内存溢出(java.lang.OutOfMemoryError)的常见情况和处理方式总结...

    1.概念预热 首先了解几个概念 新生代:新创建的进程 老年代: 持久代:不会被回收 新生代:tofromeden-xms:堆内存空间的初始大小--XX:NewSize:新生代的初始空间大小-Xmx:堆 ...

  10. ai文件如何打开及常见文件的打开方式

    ai文件如何打开?用什么软件可以打开?   用什么软件打开比较清晰些? 用Adobe Illustrator可以打开,用photoshop也可以打开 adobe illustrator ,photos ...

最新文章

  1. android 36 线程通信
  2. ChemDraw 15.1 Pro插入阿尔法可以这样做
  3. Linux Shell 命令--cut
  4. python现在好找工作吗-Python就业前景如何?培训后好找工作吗?
  5. Linux数据写操作改进
  6. Android之assets资源
  7. Hadoop计算中的Shuffle过程
  8. 模拟课----需求文本
  9. Mac OS defaults命令(Access the Mac OS user defaults system)
  10. robotframework安装_python3.9.0 + robotframework + selenium3 实例体验
  11. 分布式文件系统之MogileFS的使用
  12. c#建立mysql表_C# 动态创建Access数据库和表
  13. 怎样解题:写题解思考问题的原则
  14. wso2 mysql,WSO2 DAS +具有MySQL的集群APIM
  15. 推荐 7 个 yyds 的开源项目
  16. SQLMap用户常用命令——1
  17. 异步AsyncTask,怎样停止AsyncTask和Thread
  18. 【Python】python数据库编程
  19. 网上找到的有效的关闭UAC的方法。
  20. 解决 Windows 11 记事本崩溃闪退

热门文章

  1. axios取消接口请求
  2. C++_homework_StackSort
  3. 解决微信浏览器无法使用reload()刷新页面
  4. struts2之chain的使用
  5. [转]软件开发的“三重门”
  6. Eclipse : Android requires compiler compliance level 5.0 or 6.0.
  7. 问题总结(一)使用代码调整SharePoint WebPart 视图和列表菜单
  8. C++函数重载与引用的较好的练习实例
  9. Python学习教程:教你用Python通过微信来控制电脑摄像头
  10. ubuntu安装mysql添加密码