Atlas UpdatePanel使用技巧以及常见问题
English Version: http://dflying.dflying.net/1/archive/103_atlas_updatepanel_tips_and_faqs.html
好多开发人员将会从UpdatePanel控件开始慢慢接触Atlas。UpdatePanel功能强大并且使用简单,同时也拉近了我们和Atlas的距离。
我曾在此发表了一个对UpdatePanel的简要介绍(http://dflying.cnblogs.com/archive/2006/03/25/358547.html)并得到了很多的反馈与问题。我想有必要把这些问题以及有关UpdatePanel的使用技巧总结成一个帖子。希望能有所帮助。在这里感谢阿不,dudu以及所有提出问题或参与讨论的朋友,让我对UpdatePanel有更深的认识。
首先,最重要的事情就是关注Atlas的老家:http://atlas.asp.net/。我们知道Atlas是一个新的,正在开发中的Framework,每月,甚至每周都在发生着变化,所以作为一个Atlas开发人员,经常关注http://atlas.asp.net/是必须的,你会得到最新的消息,最新的特性以及最新的演示程序。对于新手,http://atlas.asp.net/docs提供了Atlas的API,Class文档可作参考(尚未全部完成,请多加关注)。下面还有一些Atlas以及ASP.NET的核心人物的个人网站/blog,同样值得经常访问(英文):
- http://blogs.msdn.com/brada/
- http://weblogs.asp.net/scottgu/
- http://www.nikhilk.net/
- http://weblogs.asp.net/bleroy/
- http://blogs.msdn.com/jhawk/
Atlas UpdatePanel服务器控件使用技巧:
- 务必设定ScriptManager的EnablePartialRendering属性为true。有好多人向我抱怨说他们的UpdatePanel并不以AJAX的方式工作而还是引发普通的整页PostBack,原因就在于没有设定这个属性。
- 设定触发UpdatePanel的控件为服务器控件。因为无论ControlValueTrigger还是ControlEventTrigger,指定的属性/事件都是服务器端属性/事件,都只在服务器端属性变化或是服务器端发出事件时才能触发UpdatePanel的PostBack。
- 区别UpdatePanel的两种更新方式:Always和Conditional。请参考:http://dflying.cnblogs.com/archive/2006/03/25/358547.html。我们应该设定正确的更新方式以避免更新不必要更新的Panel,造成不必要的性能/网络开销。
- 不要只使用UpdatePanel。如果你从头开始建立一个Atlas程序,仅仅使用UpdatePanel来实现AJAX可能并不是最好的选择。UpdatePanel仅仅简单的从头渲染所有的位于ContentTemplate内部的控件,在某些情况下可能非常低效,例如,对于一个包含了一个有相当多结点的TreeView控件的UpdatePanel来说,如果你只是想简单的添加一个新节点,使用UpdatePanel将会从后台取得整个TreeView并重新渲染,远不及仅存储后并把这个新的节点添加到TreeView中来得高效。在这些情况下,你最好考虑使用一些较高级的Atlas客户端控件。当然,这也加大了一些开发的难度。
- 在页面的InitComplete事件被引发前必须保证UpdatePanel已经被初始化。也就是说,不能将UpdatePanel放置于比如一个DataList的HeaderTemplate中,因为HeaderTemplate中的内容是在Databinding时期才得到的,而这时页面的InitComplete事件早已经结束。
- 在UpdatePanel中不要使用Response.Write(); 。这会扰乱UpdatePanel的执行过程。
- Atlas的客户端脚本可以使用于任何的开发平台/语言中。例如ASP.NET 1.1,纯HTML甚至PHP,但是像UpdatePanel这样的服务器端控件只能用于ASP.NET 2.0页面中。Atlas的客户端脚本实际上就是一些经过组织的JavaScript文件,当然是与服务器端选用的技术无关的。但当你使用非ASP.NET 2.0环境时,需要手动加入对这些JavaScript文件的引用,因为你无法使用ASP.NET 2.0中的服务器端控件ScriptManager。
- 小心在UpdatePanel中包含第三方JavaScript实现的组件。开发跨平台的JavaScript Framework是一件很艰巨的任务,在目前的Atlas实现中仍有很多兼容性的问题。让我们期待未来会更好或者干脆现在想办法自己解决吧。
同时,在页面上添加一个UpdateProgress服务器端控件将会使用户了解你的程序在做什么。下面顺便提一些UpdateProgress控件的使用技巧:
- 在页面上添加一个且只添加一个UpdateProgress控件。UpdateProgress控件应当是一个全局的控件,所有的AJAX操作都会自动地由UpdateProgress控件来处理。想象一下如果Gmail一下子显示了好多个Loading提示,用户一定会不知所措吧。
- 在UpdateProgress的Template中有一个magic ID:abortButton,你可以提供一个服务器端Button或者LinkButton控件并指定ID为abortButton,使用户可以取消当前执行的AJAX请求。当然,使用magic ID并不是一个好的设计方法,相信在未来的版本中这个magic ID会被一个类似<CancelTemplate>的东西取代。当然,在当前的Atlas版本中,请记住abortButton。
如有错误,还请不吝指正。相关问题也十分欢迎留言探讨。