最近主要帮一个团队测试和优化项目,可能是由于项目的参与大部分都是新手,对ajax不是很熟,而造成ajax控件滥用,本文主要总结我们最近遇到的一些问题,和大家共同探讨,希望不足支出,欢迎大家指出.也希望开发经验丰富的前辈多多指导.

  以下是我根据遇到的问题总结出来的两点心得:

1.     updatepanle 不同情况的两种使用方法 

   第一,直接用updatepanle<Triggers></Triggers>属性直接设置页面的相关控件的事件,该方法使用于简单使用updatepanle 或在同一个页面的同一个tab页。    

   第二,当在同一个页面存在多个tab页,并且不同的tab页的事件有所关联的时候,一般用在后台代码注册的方法比较适用。由于放在一个tab页的updatepanle可能无法识别或找到另一个tab页控件的触发事件,很容易导致出错,原因可能是你选的tab控件的类型所导致,我遇到过使用第三方的tab控件可以,但是使用微软或其他的第三方的tab控件却不行,虽然后者以后可能会解决这个问题,但为了你的程序能正常运行,使用代码注册不失为一个明智的选择。   比如你设计的一个页面有多个tab页,并且一个tab页里的某个控件的某个事件要触发另一个tab页的异步更新事件,那么最好用代码注册updatepanle的更新事件。    

   具体实现代码如下,也很简单:     首先在Page_LoadScriptManager1注册异步更新的触发控件        ScriptManager1.RegisterAsyncPostBackControl(btnAdd);    然后再btnAdd的某个触发事件里调用要更新的方法,  最后该事件执行后,调用更新区域的updatepanle执行update()方法即可。

2.     尽量减少在同一个页面(或tab页)里使用多个updatepanle控件

   Upatepanle 可以减轻页面和服务器的通信负担,但滥用反而会增加页面和服务器的通信负担,同一个页面使用过多的updatepanle将导致出现多次的通信,比如一个事件源触发多个更新事件。一般情况下,在同一页面的同一个tab页或table里只需要使用一个updatepanle就够了,即使是不需要更新的控件也可以放在同一个updatepanle里,只要不触发它的事件即可或者让其AutoPostBackfalse即可。

   自然如果由于业务的需要,特殊情况也要特殊对待。所以如果不是特别的业务需要,尽量让多个需要异步更新的控件放在同一个updatepanle里,统一异步更新,减少页面往返的通信次数。而至于统一异步更新,业务外观层(也就是页面层)可以借助table来解决,业务代码层(对应的页面后台代码)可以根据业务需求进行优化。

 

Posted on 2007-11-02 15:24 Enzo 阅读(2312) 评论(21)  编辑 收藏 所属分类: Dev Logs

Feedback

#1楼    回复  引用  查看    

2007-11-02 15:36 by Hunts.C      
Mark()

#2楼    回复  引用  查看    

2007-11-02 15:45 by 丹心猪(Dansinge)      
就这么一点,还有没有,急我所需,谢谢先

#3楼    回复  引用    

2007-11-02 15:47 by 2ewrewrwer [未注册用户]
看你是个高手,单词还会写错?别人是新手,看来你也用得不熟呀,faint

#4楼    回复  引用  查看    

2007-11-02 15:54 by Jeffrey Zhao      
“过多的updatepanle将导致出现多次的往通信”没这说法阿。
其实UpdatePanel的性能和多少其实关系不大的。

#5楼    回复  引用    

2007-11-02 17:33 by allen william [未注册用户]
比如你一个页面有多个下拉框控件,并且是级联关系,最上面一个更新,下面的也跟着更新,那么每个下拉框外面都有个updatepanle 那么不是要多次更新吗
一个一次,还不如多个一次更新 我也有遇到类似问题 所以我还是觉得他说的是对的.

#6楼    回复  引用  查看    

2007-11-02 17:49 by Adrian H.      
全部用WebService+直接JS调用最有效率了。。。开发速度慢点,却很灵活

#7楼 [楼主]   回复  引用  查看    

2007-11-02 18:36 by Enzo      
upatepanle的使用无非有两种情况:
1. 多个事件源触发一个局部更新

2. 一个事件源触发多个局部更新
3. 一个事件源触发一个局部更新
而至于第一,三种,只要用一个updatepanle就够了。而第二种就可能产生使用updatepanle的差别:
a,多个局部多个upatepanle;
b,多个局部最少的updatepanle;
  可以说a不是一种最优选择,而b是最好的.有人说多个局部怎么可能有最少的,其实我的意思就是通过table或其他的容器空间比如panle把n个局部精简为n-m个局部,也就是通过合并来减少.
  这有什么好处呢? 
  一个事件源触发多个局部更新使用多个upatepanle;那么将导致多次向服务器请求,而有效的优化这多次服务器请求为更少的请求,不是可以降低服务器的负担吗?
  可是有的人往往不经考虑就使用多个updatepanle.自然不好.
  而有时所谓的多个局部更新,其实是同个同页面或tab页的多个控件,那么就很有必要让这些控件统一更新,减少对服务器的请求.

#8楼    回复  引用  查看    

2007-11-02 20:28 by Jeffrey Zhao      
@allen william
完全可以做到一次更新多个UpdatePanel

#9楼    回复  引用  查看    

2007-11-02 21:49 by Cat Chen      
过多的UpdatePanel其实不会造成流量负担的,设置得当的话反而能够更好的细分一个交互必须更新的内容,从而减轻流量负担。

#10楼    回复  引用  查看    

2007-11-03 08:22 by 橘子&猪      
个人还是比较喜欢用Prototype,UpdatePanel每次都要Post整个页面回去,这个令人很不爽.

#11楼    回复  引用  查看    

2007-11-03 09:08 by 阿不      
标题应该是,合理使用UpdatePanel.呵呵

#12楼    回复  引用  查看    

2007-11-03 10:43 by 萧笑九州      
JQuery Or Prototype

#13楼    回复  引用    

2007-11-03 13:29 by HUze [未注册用户]
@Jeffrey Zhao
一次更新多个updatepanle 是可以的,但是就有多次通信,虽然减少的更新的数量,可是更新的次数却相应的增加了,这样频繁通信, 其实还是没起到优化的作用 而一次把所有要更新的统一起来一起更新 不是可以减少通信次数,减少对服务器的多次请求

#14楼    回复  引用  查看    

2007-11-03 15:30 by Jeffrey Zhao      
@Jeffrey Zhao
我听懂你的意思了,不过UpdatePanel无法在客户端同时发起多个更新请求的,一个是因为UpdatePanel实现,还有就是客户端限制2个同时连接数。

#15楼    回复  引用  查看    

2007-11-03 15:30 by Jeffrey Zhao      
@HUze
谁说一次更新多个UpdatePanel需要有多次通信了?说了是“一次(通信)”更新多个UpdatePanel……

#16楼    回复  引用    

2007-11-04 16:21 by Prototype up [未注册用户]
@橘子&amp;猪
Prototype 更灵活

#17楼    回复  引用  查看    

2008-03-14 14:57 by 江水滔滔      
不知道,你现在还看不看你这个文章。

那么请教了!由于用户操作习惯问题,界面已经设置完成的问题。

现在我在我的系统用用到了updatepanel + ModalPopupExtender+ GridView
其中出现了情况是用户点了GridView的值后,其实相当于另外一个页面的传参了。会出现一些基本信息。所以这个时候updatepanel 更新了一次。当用户修改好的以后updatepanel 又更新了一次。
问题出现了,这个时候服务器内存达到180M,现在基本是5个客户端在操作。
由于该界面全是数据,可以想象成是Excel,你说我如果解决以上矛盾呢?

而且每次点击的时候都比较慢。。。。。
唉,请帮忙指点

#18楼 [楼主]   回复  引用  查看    

2008-04-10 14:33 by Enzo      
你可以设定updatepanel 只对GridView的某个点击事件才启用异步更新,或者在用户更新完后在点击一个放在gridview里或旁边的的button去触发异步更新,你可以这样设定看看? 如果不行的话,我再想想办法!

#19楼    回复  引用    

2008-04-10 14:55 by szbaby1221 [未注册用户]
@ Enzo
但是
你把我的gridView想成是Excel,每个栏位用户都可以编辑。所以按钮是动态的。我是一个隐藏按钮,更新事件,是后台写的方法,强行。update.
gridView欄位很多.紀錄也很多.頁面超慢!

#20楼 [楼主]   回复  引用  查看    

2008-04-11 19:10 by Enzo      
我建议你统一用一个来异步更新就好,不然每编辑一个栏位就自动更新,太浪费资源,也不好。如果可以一次请求就完成,为什么要分多次呢?
用ajax就是为了减轻请求,提高ui的交互的友好型,用的太多就等于没用ajax反而不好。
不知道你这样设计符不符合的你最初目想要的效果,当然你说也属特殊情况,毕竟要呈现的数据很多,
不过你可以想想是不是可以做些改进。

#21楼    回复  引用    

2008-04-14 10:55 by szbaby1221 [未注册用户]
是这样的,这个界面其实是一张报表。用户从不愿意分界面录入数据。所以怎么说呢?他们要求直观,又不愿意去多点其他的界面。我说服不了他们。
这能做出那样的界面满足他们的要求。
每处理一个都要写道LOG表中。其中字段主键又是随着当前时间的月份变化。
订单 4月 5月 6月 7月 。。。。。。
这个都是预估,采购可以去下单

所有的界面都是有联系的。我不知道怎么做了。如果一次可以完成所有的录入那是最好了。可是LOG怎么做呢?有备注的。
用户不懂技术,他不管怎么样,他就要方便和快,明了。可是这其中都有矛盾!

标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  博客园首页

  新闻频道

  社区

  小组

  博问

  网摘

  闪存

  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2007-11-25 19:53 编辑过
成果网帮您增加网站收入


相关链接: