阿不

潜水

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

在我的《无刷新“页面跳转”》post中,提出一如何实现无刷新页面跳转的设想,并且使用在UpdatePanel中动态加载UserControl(称之为视图)的办法加以实现。通过这一段的时间的实践,从实现的效果来看,还是比较让人满意的。在每个视图(UserControl)的转换过程中,页面不会出现刷新的现象,可以大大提高用户体验的友好性。同时由于刷新没有重新刷新,原来还需要每次请求的gif,css,js等等这些资源文件在每次的视图转换中是不会重新请求加载的,这无疑可以减少服务器的资源消耗,提高服务器的吞吐能力。这也是我希望得到的结果,但是不得不承认,这样做也有很多的缺陷在这里面:

首先,由于它是依赖于Atlas的UpdatePanel控件,所以UpdatePanel一些不足都成了它最大的限制。比如在UpdatePanel中不能使用直接使用FileUpdate上传文件,与其它的一些第三的控件和UI开发包可能会存在冲突等等。还有可能存在的一些BUG,也会给我们造一些难题。但总体来看,这些问题完全可以通过一些变通办法加以解决,而且可喜的是越来越多的第三控件都是努力的去适应Atlas而做一些变化。同时使用UpdatePanel,可以很好的避免页面的重复提交问题(当一个页面执行的PostBack事件后,再次刷新页面会提示是否重试,如果是的话,有可能就会造成数据的重复提交),但是另一方面,你也必须非常了解UpdatePanel的页面执行机制,实际上它仍然是一个PostBack事件,而且如果查看页面的IsPostback,它的值仍然为true。而且它完全遵从普通页面的PostBack执行流程,该执行的事件一个都没有漏掉,唯一的不同是,有些执行的结果可能不会被反馈在页面上,因为它并没有被包含在需要更新的UpdatePanel里面,但是它们的ViewState值已经发生了变化了。

其次,由于视图的跳跳没有再次去加载js文件,可以就有可能会存在一些视图需在动态加载的js文件无法被正确加载。在使用atlascontroltoolkit时就遇到这样的问题,遇到这种情况可以在页面中预先加载。如果是一个单独的js文件的话则可以通过Page.ClientScript.RegisterClientScriptInclude注册包含的js文件,同样也可以通过这类似的客户端脚本接口注册不同形式的脚本代码块。

最后,由于视图跳转都是发生在导航控件的PostBack事件中,我们都知道,在页面PostBack时,它将会把页面当前的ViewState提交到服务器上。而这时,我们每次发生视图跳转时,事实上都会将页面的ViewState传到服务器上,再次由服务器处理完后,转到新视图实现视图跳转。比如从视图A转到视图B,当前页面的ViewState大小为50K,这时就要求首先将50K的页面先传给服务器,还原ViewState,然后再加载新视图,生成新视图的ViewState,传回客户端。而普通页面的页面跳转(请求)则一般不需要将原来的页面传到服务器,还原ViewState等步骤,一般它的请求无非就几十,上百个字节(除非页面跳转是发生在PostBack事件,在服务器端使用Response.Redirect方法跳转)。面对这种情况,如果网络环境允许的话,那完全没有任何问题的。又或者我们可以完全禁用掉页面的ViewState,这是最理想的方案,这样做可以大大提高程序的性能,但是没有ViewState后,就需要有比较深厚的技术功底和更加细心的编程习惯了。

以上就是目前为止,遇到的一些问题的总结,以后可能还会遇到其它不同的情况,相信都能通过一定的手段加以解决。由于之前没有人实践过,通过这样的实践还是可以更加深入的理解asp.net各个方面的细节。另外,通过最近对iFrame的一些新的接触,比如SuBModal 通过框架模拟的ModalDialog效果,Back Button Support for Atlas UpdatePanels通过框架可以模拟在UpdataPanel中实现后退/前进,bookmark功能等等。有一种新的想法,是不是也可以使用动态的iFrame实现这样的无刷新视图(页面)跳转,又或者gmail就是这样实现的?猜想而已。

posted on 2006-09-18 20:27  阿不  阅读(3806)  评论(7编辑  收藏  举报