代码改变世界

十分钟内学会:无刷新的页面间导航

2006-12-10 14:18  Cat Chen  阅读(7443)  评论(23编辑  收藏  举报

Question

通过ASP.NET AJAX,我们能够实现页面内无刷新的异步回送。然而我们不可能将功能都放在一个页面里,这样设计非常不方便,动态加载控件的逻辑也复杂,所以还是要在多个页面间导航。可以让这种页面间的导航也无刷新吗?

Answer

要页面间导航当然要刷新,这是无法避免的,但我们总不能把原本属于多个页面的逻辑塞在一个页面里吧,所以要想个办法把这些逻辑分开来。这里用到一个小技巧,就是使用UserControl来作为基本的视图单位,而不使用Page,这样改变加载的UserControl也就改变了视图,相当于实现了导航,但Page没变所以还是可以无刷新。

然而怎么动态加载UserControl呢?Page.LoadControl?那个不是很麻烦吗?自己处理得不好又可能导致控件事件不触发之类的问题啊。所以我特意做好了一个可以动态加载UserControl的ViewPanel控件,大家直接拿它来用就行了。

这个控件只有一个属性需要关注,那就是ViewPanel.VirtualPath,你把UserControl的路径(例如"~/UserControls/Sample.ascx")设置给它之后它就会自动帮你加载该UserControl。在运行过程中,如果你修改了这个属性,控件自己会通过ViewState来保存该值,也就是一次修改永久有效,无论之后有多少次回送都没问题,直到你下一次再修改该值。

最好,要实现无刷新的视图间导航,你只需要在UpdatePanel中放置一个ViewPanel,之后不同的视图都使用UserControl设计(其实设计起来和使用Page时差不多),通过ViewPanel动态加载这些UserControl也就实现了无刷新的视图间导航了。

P.S.

这个方案社针对我的一个项目设计的,导航用的LinkButton都在UserControl外面,所以要改变ViewPanel.VirtualPath很容易。如果你的导航控件在UserControl内,那就需要Page.FindControl来找到ViewPanel然后再改变其VirtualPath值,这个比较麻烦。

我迟点会对此提供一个解决方案,应该就是一个ViewNavigationLink控件,使用起来如普通的LinkButton,它能自动寻找自己所在的ViewPanel并更改其VirtualPath属性。如果你期待更新的话,欢迎订阅Cat in dotNET