随笔-50  评论-529  文章-5  trackbacks-4

下班了,刚到家,老婆在做饭,小家伙在玩玩具,暂时没骚扰我。呵呵!趁这空闲写会博客。前两天答应改造DynAjax为JQuery版本,今天就完成这个任务吧。
上一篇随笔介绍了轻量级的Ajax解决方案DynAjax,可惜原作者只有写支持Prototype.js版本的。
DynAjax
用到Prototype.js特殊用法的地方不多,就dynAjax.aspxdynAjax.aspx.cs
特殊用法分别是(红色部分标出):

  • var DynAjaxManager = Class.create();dynAjax.aspx14
  • new Ajax.Request(....)dynAjax.aspx25行至41
  • parameters: .... encodeURIComponent(Object.toJSON(args)),dynAjax.aspx28 
  • dynaResult = request.responseText.evalJSON();dynAjax.aspx30

以上是dynAjax.aspx的,下面的是dynAjax.aspx.cs的:

  • dynamicJsText += "var " + className + "Class = Class.create();\n";dynAjax.aspx.cs64

分别说说红色部分的用法:

  • Class.create() 新建一个类,JQuery中我没找到替代功能,用function 类名(){}代替。
  •  new Ajax.Request() 相当于JQuery$.ajax();
  • Object.toJSON(xxx) xxx转换为JSON字符串JQuery中也没找到替代函数,用http://www.json.org/js.html json2.js JSON.stringify(xxx)代替;
  • responseText 返回数据的文本形式;发现JQuery中这个没必要,去掉无妨。
  • evalJSON() JSON字符串转换为JSON对象JQuery没有可替代对象,同样借助json2.js JSON.parse(xxx);不过我还是推荐用Javascript内建的eval(‘(‘+xxx+’)’);因为JSON.parse目前版本不完善,会碰到转不了的情况,以后再分析吧

按以上方法改版后,文件变动如下:

  •  prototype.js
  •  jquery.js
  •  json2.js

改版后dynAjax.aspx代码如下:

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="dynAjax.aspx.cs" Inherits="_dynAjax" %>
/**********************************************************************
 * DYNAJAX Project - code by Benoit BEGUIN
 * first release: october 2007
 * last update: february 2008
 * Paris, France
 * 
 * DynAjax web site: http://www.dynajax.org/
 * Any question: mailto:admin@dynajax.org
 * Company support: http://www.odesys.fr
 *********************************************************************
*/
/* ------- GENERIC CONTENT ------- */
function DynAjaxManager(){}

DynAjaxManager.prototype 
= {
    initialize: 
function() {},
    getDynaData: 
function(classId, methodName, args, callBackMethod) {
        
var dynaResult = null;
        
var asyncCall = false;
        
if (callBackMethod && typeof callBackMethod == "function") {
            asyncCall 
= true;
        }
        
        $.ajax({
        type:
"POST",
        url:
"AjaxDataHandlers/DynAjaxHandler.aspx",
        data:
"classId=" + encodeURIComponent(classId) + "&methodName=" + encodeURIComponent(methodName) + "&methodArgs=" + encodeURIComponent(JSON.stringify(args)),
        async:asyncCall,
        success:
function(request){
                    dynaResult 
= eval('('+request+')');//JSON.parse(request);
                    if (callBackMethod) {
                        callBackMethod(dynaResult);
                    }
                },
        error:
function(e) {
                    dynaResult 
= null;
                    
if (callBackMethod) {
                        callBackMethod(dynaResult);
                    }
              }
        });
        
return dynaResult;
    }
};
var dynAjaxManager = new DynAjaxManager();
/* ------- END OF GENERIC CONTENT ------- */
/* ------- DYNAMIC CONTENT ------- */
<%= dynamicJsText %>
/* ------- END OF DYNAMIC CONTENT ------- */


dynAjax.aspx.cs 第64行改为如下代码:

             dynamicJsText += "function " + className + "Class(){}\n";

别忘了在你的ajax特效网页更新js引用(jquery.js和json2.js)。

最后,我做了个演示用的压缩包,下载dynAjax_v1.04_jquery_by_kai.ma.rar  Enjoy it!

Tag标签: JQuery,DynAjax,
posted on 2008-03-17 22:23 Kai.Ma 阅读(2501) 评论(17)  编辑 收藏 所属分类: ASP.NET & AJAX

评论:
#1楼  2008-03-17 22:48 | Q.Lee.lulu      
辛苦了!!
  回复  引用  查看    
#2楼  2008-03-17 23:37 | 自由、创新、研究、探索……      
非常不错,能否和这个原版作者合作一下,让他同时支持Prototype和jQuery就太好了
  回复  引用  查看    
#3楼  2008-03-17 23:51 | nfa2dfa      
看了一下dynAjax.aspx.cs,连反射和json反序列都用了,要是自己用,就不必这么麻烦了吧。
再说安全性
public static bool checkAuthentication()
{
return (HttpContext.Current.Session["crtUser"] != null);
}
这么就糊弄过去了阿
  回复  引用  查看    
#4楼 [楼主] 2008-03-18 09:06 | Kai.Ma      
@nfa2dfa
你仔细看一下xml配置文件,那个安全性验证方法,是可以自己设置的。这里作者只是演示。
  回复  引用  查看    
#5楼  2008-03-18 09:10 | nfa2dfa      
@Kai.Ma
那个xml配置文件我看的很仔细。我意思是你就这么糊弄过去。
  回复  引用  查看    
#6楼  2008-03-18 09:31 | Clark Zheng      
强!
  回复  引用  查看    
#7楼 [楼主] 2008-03-18 09:43 | Kai.Ma      
@nfa2dfa
……我是翻译原作者的,原作者大意是点到为止,我也欣赏他这种做法,“轻量级”的意味表达得比较到位。

安全验证方法建议:一般都是引用权限验证方法。打个比方,可以设计一个返回bool的UserPermissionCheck方法验证User的某个操作是否具有权限。这个又是权限管理系统的事儿了。
  回复  引用  查看    
#8楼  2008-03-18 09:52 | nfa2dfa      
@Kai.Ma
我十分了解作者的xml配置文件的用意,为了不侵入调用者的代码,他还不辞辛苦的用了反射。
但是,从代码角度说,ajax用的是js库的,json序列化和反序列化用的是json库的。更新函数显然要自己订制,也只有权限验证是值得一看的,却可以算空着。这轻的可以算没有分量了。
  回复  引用  查看    
#9楼  2008-03-18 10:04 | 尧尧      
都2008了,唉~~~
  回复  引用  查看    
#10楼 [楼主] 2008-03-18 10:07 | Kai.Ma      
@nfa2dfa
呵呵,大音希声,大巧若拙。你觉得哪个框架好呢,不妨推荐推荐给博客园诸兄弟,大家一起充充电。我个人觉得DynAjax是个学习例子,当然,他还有很多工作要做。
  回复  引用  查看    
#11楼  2008-03-18 13:13 | nfa2dfa      
@Kai.Ma
倘若是吵架,以退为进是不错的策略.
我也承认DynAjax是个不错的学习例子,因为它小,原理直观,也是很舒服的风格.

不过也许我会这么用它,
1.用ashx来做请求页面,不过生成一个流水号作为更新的token,含过期信息和字段是否受保护的信息,作为xhr的一个参数作认证用。
2.不要json序列化或者反序列化参数,简单处理一下即可,这样就无需json.dll和json2.js了。
3.不要反射,这点小东西还配置干么,碍手碍脚的。
  回复  引用  查看    
#12楼 [楼主] 2008-03-18 13:28 | Kai.Ma      
@nfa2dfa兄误会了,我哪里有吵架的意思。大家都说讨论出真知。
第1点建议ashx让我看到了AjaxPro的影子,其余两点不太理解,不知道你是否有时间做一个演示例子,反射有什么不好吗?希望能看到你做Ajax框架。

  回复  引用  查看    
#13楼  2008-03-18 14:21 | TT.Net      
好东西,学习中,博主EMAIL多少交流下~
  回复  引用  查看    
#14楼  2008-03-18 14:26 | nfa2dfa      
@Kai.Ma
因为性能上的偏见,不喜欢反射。

没用过ajaxpro。

2.dynajax把函数签名(参数列表)做成了json,请求的时候合并为一个参数,响应的时候把json还原成一串对象。这就是json序列化和反序列化。我觉得没有必要。简单用不引起冲突的分隔符隔一下就算序列化了,解析也很容易。

dynajax也就简单把server和browser两端简单包装了一下,依我看,就算每做一个项目就重写一遍,也没什么大不了的。

写好了放出来。

小弟我心直口快,并以此为乐。
  回复  引用  查看    
#15楼 [楼主] 2008-03-18 15:03 | Kai.Ma      
@TT.Net
多多交流 kai.ma(at)163.net
  回复  引用  查看    
#16楼 [楼主] 2008-03-18 15:06 | Kai.Ma      
@nfa2dfa
你的技术评论还是挺中肯的。
关于反射和性能的话题讨论太多了就不说了。
我觉得,规范、方便的后果很可能就会损失性能。看看MS Ajax多么臃肿。
多多交流,你博客上关于IE8的文章很不错!
  回复  引用  查看    
#17楼  2008-03-18 15:43 | nfa2dfa      
@Kai.Ma
ms ajax 及其controltoolkit俨然就是一个大笑话。
不是技术问题,是市场定位的问题。
除非非动态不可,否则绝不动态。
你看看dynajax里面用了几次反射,又是配置文件的io,看了都让人揪心。
方便规范和性能损失没有必然联系。不过为了写出可配置的代码,现实让我们和自己的矜持作一番斗争。
不过除了反射还是有其他路走的,我自己用着顺手的有ironpython的eval或execute,或是代码生成器。前者损失一点性能,但是可以为所欲为了。后者更新代码的时候还是有一定的风险的。
  回复  引用  查看    

标题  
姓名  
主页
Email (只有博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2008-03-17 22:50 编辑过
 
另存  打印