游民家园

leafyoung v.s. dotnet

ASP.NET AJAX Client Library: 更繁?更简?

这两周周末终于决定忙里偷闲,利用业余时间好好学习ASP.NET AJAX,虽然服务器端控件比如UpdatePanel、Timer等很好用,不过总感觉雾里看花,没法看到ASP.NET AJAX的原貌,所以决定花些时间学习它的Client Library。断断续续看了一些资料,在稍微了解大概之后决定用它写点东西检验一下学习成果,毕竟实际动手才能证明我确实掌握了这门技术,而不仅是纸上谈兵,呵呵。

拖拽效果目前非常流行,比如Pageflakes、protopage等都频繁使用了这项技术用以改善用户体验并且获得良好的赞誉。很多人对这项技术深感恐惧,好像它是一门极为高深的技术,我在很多论坛上看到好些人都在“冰天雪地裸体后空翻720度”求教具体如何实现,实际上这项技术本身并不复杂,简单的拖拽效果区区几十行代码就可以搞定了。下面就简单实现一个拖拽DIV的效果。

首先不考虑ASP.NET AJAX,用最原始的Javascript来实现我们想要的效果,区区二十余行代码就可以了,相信任何有点Javascript基础的同志都可以看得很明白,因此我就不多说了,贴代码了事:

可移动的Div(1):MovableDiv

具体使用时就是实例化一个MovableDiv对象即可,如"new MovableDiv('div1');"。当然,记得给div1设置position为“absolute”,否则有啥意外我概不负责,呵呵!

好,上面代码完全没有使用任何ASP.NET AJAX的特性,下面利用ASP.NET AJAX Client Library提供的机制实现完全相同功能,呵呵,解释这些代码实在费劲,而且现在不是提倡“代码即文档”嘛,相信大家的能力以及我的编码规范程度(自恋一把,喉喉),同样贴出代码如下:

可移动的Div(2):WidgetContainer

同样,列出使用方法如下,这里使用了“$create”进行创建,这是创建Sys.Component及其子类如Sys.UI.Control等的简写形式:

创建WidgetContainer

在写的过程中我就暗暗皱眉,怎么写了半天还没完?在没用ASP.NET AJAX Client Library之前,我3分钟就把移动效果运行起来了,而现在10分钟都过去了还没搞定!写完一对比,代码量多出N倍,为了实现相同的效果,我居然写了近80行代码,晕死!虽然看起来更OO些,非常像C#这种高级语言,但是这样的效果值得吗?对于熟悉Javascript的开发人员而言,说不定第一种写法更加直观呢!前一阵子不知在什么地方看到这样的评论:ASP.NET AJAX Client Library对JavaScript的封装接近病态!是不是真的如此我不知道,不过从开发效率而言似乎反而降低了?!也许这种写法对后期维护有好处,这也许能弥补一部分损失吧,不过我还是不知道!

注:WidgetContainer是MovableDiv的翻版,但是不知道为什么,如果拖动WidgetContainer所代表的div到浏览器窗口的右边缘或下边缘外,就会出现很诡异的现象,目前位置还不明白为什么,有心的同志可以帮忙看看,谢谢先!

附:由于使用了setCapture和releaseCapture,因此上面的代码只能在IE浏览器中运行。

update @07.04.11 13:48
不过,再仔细看看,在ASP.NET AJAX方式的实现中也就是多了initialize和dispose两个方法,用于初始化和资源释放,不过这样做有什么好处呢?即使我不释放好像也不会造成什么损失吧。有劳对此比较熟悉的大佬给我讲讲,嘿嘿@_@

posted on 2007-04-11 12:45 游民一族 阅读(2916) 评论(16) 编辑 收藏

评论

#1楼 2007-04-11 13:36 编码风格[未注册用户]

楼主编码方法需要改进,比较差  回复 引用   

#2楼[楼主] 2007-04-11 13:37 游民一族      

@编码风格
哦,能不能具体指出,让我知道应该如何改进呢,呵呵
 回复 引用 查看   

#3楼 2007-04-11 13:49 City22      

很遗憾,用this.obj.onmousemove = function() 来绑定事件后没有向asp.net ajax里面一样做dispose()操作,将会造成内存泄露。

内存泄露对于大型RIA来说可是大忌。
 回复 引用 查看   

#4楼 2007-04-11 13:52 木野狐      

风格很好的啊  回复 引用 查看   

#5楼[楼主] 2007-04-11 13:57 游民一族      

@City22
IE等浏览器不应该这么弱吧,我没看过内存泄漏相关的资料,不过照理说这么简单的闭包不至于导致这么严重的后果啊!
 回复 引用 查看   

#6楼 2007-04-11 14:12 Jeffrey Zhao      

开发效率很明显是增加了,可能小处看不出来吧,呵呵。
但是如果您开发一个略为大型的系统,例如一个真正像Pageflakes这样的应用,就会觉得实在太方便了。
我开发过一个形式上Pageflakes + Windows Live Space这样的应用(感觉换肤作的更加灵活),觉得ASP.NET AJAX真的很好用。它的Component/Control/Behavior模型、Web Service访问、尤其是浏览器兼容层,让开发效率大大提高了。
 回复 引用 查看   

#7楼 2007-04-11 14:12 Jeffrey Zhao      

@游民一族
我认为编码风格很好啊。
 回复 引用 查看   

#8楼 2007-04-11 14:15 City22      

IE太脆了,如果你想在自己的网页上做个拖拽就没什么问题,但如果你想做个office online,还是规矩点好

现在哪里有下Client Library格式化好的源码?昨天晚上找了找没有啊,以前的CTP里还有呢,现在怎么没了?
 回复 引用 查看   

#9楼[楼主] 2007-04-11 14:27 游民一族      

@City22
下载包里那个debug版本的格式的很好啊,不用再格式化了吧!
 回复 引用 查看   

#10楼 2007-04-11 14:40 非我      

语言越高级写起来越麻烦、代码量越多,但设计、阅读、维护越简单  回复 引用 查看   

#11楼[楼主] 2007-04-11 14:43 游民一族      

@非我
Javascript是解释性语言,这样应该会造成相对运行速度变慢,而且代码量变大势必影响它的下载速度,这让我耿耿于怀,呵呵
 回复 引用 查看   

#12楼 2007-04-11 15:20 Jeffrey Zhao      

@游民一族
下载速度是小问题,真的是小问题。
 回复 引用 查看   

#13楼 2007-04-11 18:54 yzx110[未注册用户]

大型RIA内存泄漏真是个问题,浏览器兼容性也是个大问题,最近一直被这两个问题所困扰

@Jeffrey Zhao
下载速度是小问题么?不知道是在哪种场景下
我觉得下载速度是大问题,像最近在做的www.myholo.com,用了很多手段来优化下载速度,才达到比较好的效果,否则也面加载真的慢得很。

 回复 引用   

#14楼 2007-04-11 20:26 Cat Chen      

你的第一个做法其实是仅仅支持IE的,因为你直接调用了window.event来获取事件参数。如果要做到兼容不同浏览器,还需要更多代码。

另外,既然你用了这个Library,最好就根据它的正规做法来做可拖放内容,也就是写成Behavior并且通过DrapDropManager来完成拖放。然而这样做的话,代码也会更多,呵呵……

所以,其实比较代码不是那么简单一回事。
 回复 引用 查看   

#15楼 2007-04-11 20:52 Jeffrey Zhao      

@yzx110
是啊。再复杂,相差10K的脚本已经很大差距了,但是下载起来也就是几秒钟。
关键在于优化,优化好了之后就可以了,呵呵。
 回复 引用 查看   

#16楼 2010-04-12 19:52 一点一滴的Beer      

想请教下LZ,我到http://www.asp.net/ajaxlibrary/download.ashx上下载了那个ASP.NET Ajax Library
但是在VS2008下载不能运行,就是直接点击里面的那个*.SLN文件,打开项目后,好多错误,因为项目文件太多,我也不清楚到底问题出到哪了。请求LZ指点下。
 回复 引用 查看