在用ASP.NET做网站页面的时候,最常见和最麻烦的需求便是页面的数据绑定。对于大多数内容网站而言,动态页面和静态页面的的区别仅在于是否有动态数据绑定在上面。然而随着Web前端技术的发展,我们所面对的页面也越来越复杂,譬如说这种页面或是这种页面,在ASP.NET传统的技术下,就很麻烦。
最近几年一直在做ASP.NET,其实我一直很讨厌WebForm的模型,这种将WinForm的套路直接照搬到Web上的做法只是把问题变得更复杂。我在探求一种与HTML完美契合,真正适应HTML的游戏规则的页面处理引擎。我想,这个引擎至少要有这样一些特点:
1、完全的控制HTML,能够自由的决定HTML元素的类型、个数、结构。
2、不会劫持HTML,例如修改元素的id或是name。
3、不要诸多限制,例如只能有一个form或是只能本页提交。
OK,上面这几条完全是针对WebForm模型来说的,没错,这些是WebForm让我觉得最恶心的问题。HTML其实是一个很好的行之有效的游戏规则,在其上另外构建一套秩序,而又不能适应丰富的网站表现形式,WebForm也就注定只能在网站管理后台施展拳脚。
那么除此之外,我还希望:
4、能够像在客户端一样操作每一个HTML元素,每一个HTML元素都有友好的访问接口。
5、可以自动适应不规范的HTML文档并规范化输出。
6、可以理解HTML文档并进行适当的优化(例如简写样式,更极端一点,删除font标签或是合并连续的span)。
7、能够方便的进行数据绑定。
8、能够分离数据绑定和处理逻辑与页面,避免对模板页面进行破坏性修改,代码可以适应页面的调整,修改页面不会广播到代码。
…………
虽然有这样一个理想,但在很长一段时间内,我并没有找出一个合适的切入点。直到我接触了jQuery,并尝试用jQuery进行了一些复杂页面的数据绑定。结果正如你所见,只需要简单的脚本,就完成了看起来很复杂的事情。
于是,我便开始着手在C#上建立一个类jQuery框架,这就是Jumony的由来。
Jumony真正的开发工作比我想象的顺利很多,思路对了开发起来其实是很快的。我选用了HtmlAgilityPack作为我的HTML Parser,这个东西的好处除了开源之外,更重要的是为C#提供了友好的DOM访问接口,老实说mshtml的COM接口用起来真让人抓狂。然后是CSS选择器,原本以为会是一件很麻烦的事情,但事实上我只用了一个周末就实现了核心的选择器。正好手头上有一个项目。便直接拿来实验,效果完全超出了我的期望。像这个页面下面的列表,每隔三个便有一个样式的切换,直接用Repeater来做数据绑定是一件很烦人的事情,而用选择器,则完全可以忽略不同item之间的区别,只要主要结构不变,那么每一个item的绑定逻辑就可以一样。而且代码写起来几乎是一种享受,就像jQuery那样,只需要描述自己的意图便可。。。。
这里所举的这个例子,使用的是Jumony非常原始的一个版本,你可以看到页面的扩展名还是ashx,然后代码也不够简洁,但已经可以极大地提高开发效率。Jumony仍然在开发和完善中,在8月2日,我得到了一个相对稳定一些的版本,并为其作了一个tag分支,这也就是这一次与大家分享的版本。大多数的选择器均已被实现,提供了大量的数据绑定的辅助方法,可以用很少的代码完成一些看起来很复杂的数据绑定。我在部门例会上演示了一下利用Jumony把网易的首页扒下来,再把其中一个部分用新浪的新闻数据绑定。当然更多更好玩的应用有待大家去发掘。
我并不希望在这里列出一份功能列表,或是使用手册。一则是我没有时间也不擅长做这些工作。其次是Jumony每天都有新的特性被加入,我也不记得到底哪些特性是包含在这个CTP里面的了。
还是不多说废话了,对于Jumony,我觉得,玩它,用来做一些有趣的事情,就是最好的了解方式,就像你不会看完了jQuery的文档后才开始用jQuery写页面。
下载地址:http://files.cnblogs.com/Ivony/Jumony_CTP(20100802.1).rar
解包后是一个网站(是WebSite不是WebProject),用VS的添加现有网站功能打开,然后用VS自带的ASP.NET Development Server(IIS需要映射扩展名,麻烦)浏览Beginning.htm页面即可。
源代码随下一篇文章(预计下周)发布,请不要在下面留个邮箱什么的(你不会收到代码而只会收到代开发票或是福建铁观音之类的邮件),先玩吧,源代码整理好后即随下篇文章发布。