代码改变世界

CommunityServer 2.0中的Ajax和Anthem比较

2008-02-25 22:05  BAsil  阅读(2979)  评论(10编辑  收藏  举报

在园子里面的兄弟为aspx和mvc的争论不休的时候,由于工作的关系,我还在用着可怜的framework1.1,我没有使用过Asp.net ajax(1.1不支持),所以这里我把CommunityServer 2.0中的Ajax和Anthem作一下比较;当然也是为我的下一篇文章基于CommunityServer 2.0二次开发之登录控件做一个铺垫,稍后奉上。
1. Anthem和CS中的Ajax方式很相似,都需要调用脚本里的CallBack函数(CS中为Ajax_CallBack,Anthem为Anthem_CallBack,传递的参数稍有不同,但是需要注意的是Anthem_CallBack的参数updatePageAfterCallBack,这个参数是和Anthem服务器控件的更新有关系,我们稍后说)来完成页面的异步提交,异步提交时url为当前页加上CallBack状态值(CS中为Ajax_CallBack=true,Anthem为Anthem_CallBack=true)。
2. 脚本的CallBack函数,两者生成稍有不同,虽然都是通过Manager的Register注册,CS中的Ajax可以看出调用了AjaxManager的静态方法,此方法的作用就是分析传进去的参数(这里的参数为this也就是页面的引用),生成客户端Ajax_CallBack脚本。在生成脚本之前自动去找在此页面有多少个带了AjaxMethod属性的方法,一个服务器方法对应一个客户端Ajax_CallBack方法,生成了客户端脚本后我们只需要在客户端写上少量的调用方法即可与服务器通讯了;而Anthem由Anthem.dll Resource的Anthem.js取得CallBack脚本。
3.还有两者在Register中还注册了当前控件的PreRender委托,关于这部分请参照Felix的文章Community Server系列之四:Ajax在CS2.0中的应用1,简单一点就是利用控件生命周期基本结束时手动的调用Render取得html返回。

4.另外一个需要注意的问题是Anthem由于封装了服务器控件,使我们能够在不需要了解Ajax机制,且改动代码不大的情况下使用。具体的机制是,Anthem服务器控件在Render的时候使用Anthem.Manager.WriteBeginControlMarker和WriteEndControlMarker将控件的html内容用特殊的标记包裹起来,当CallBack得到Results后在脚本中根据updatePageAfterCallBack的值(前面提到,anthem中多为真)调用Anthem_UpdatePage脚本函数将更改后的值根据控件特殊的标记更新到正确的位置,完成无刷新更新。

5. 在使用Anthem过程中的一些问题,由于只有标识为UpdateAfterCallBack=true的控件才能够完成无刷新更新,如果页面的控件比较多,而且Asp.net控件和Anthem控件堆到一起时,代码非常的乱,调试起来,呵呵,想死的心都有。另外Anthem的脚本会自动生成到aspx页中,个人感觉不便于缓存,而且如果首页上只有登录控件使用Anthem,也会生成大量的Anthem脚本文件,很是不爽。而CS2.0的Ajax,给人感觉代码比较简洁,有的时候也比较灵活。

总的说来我估计Anthem应该是参考了CS2.0的部分代码,当然CS也可能是参考了别的Ajax实现,这里不深究了,都是开源,共同进步嘛,也希望园子里的朋友多多拍砖呵呵。