转:无刷新的页面间导航
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也就实现了无刷新的视图间导航了。
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
namespace CatChen.Cocollab.Web.UI.Controls
{
public class ViewPanel : System.Web.UI.Control, System.Web.UI.INamingContainer
{
private string _virtualPath;
private Control _view;
public string VirtualPath
{
get { return this._virtualPath; }
set
{
string oldValue = this._virtualPath;
this._virtualPath = value;
if (this.Page != null && value != oldValue)
{
this.ChildControlsCreated = false;
this.EnsureChildControls();
}
}
}
public Control View
{
get { return this._view; }
}
protected override void OnInit(EventArgs e)
{
base.OnInit(e);
if (!string.IsNullOrEmpty(this.VirtualPath))
{
this.EnsureChildControls();
}
}
protected override void LoadViewState(object savedState)
{
Pair pair = savedState as Pair;
if (pair != null)
{
base.LoadViewState(pair.First);
this.VirtualPath = pair.Second as string;
}
}
protected override void CreateChildControls()
{
this.Controls.Clear();
if (string.IsNullOrEmpty(this.VirtualPath))
{
return;
}
if (this.Page == null)
{
throw new Exception("ViewPanel.Page is null.");
}
this._view = this.Page.LoadControl(this.VirtualPath);
if (this._view == null)
{
throw new Exception("ViewVirtualPath cannot be loaded.");
}
this._view.ID = "ucView";
this.ClearChildState();
this.Controls.Add(this._view);
}
protected override object SaveViewState()
{
return new Pair(base.SaveViewState(), this.VirtualPath);
}
}
}
原文也是博客园的,先留着,以备研究
参考原文:http://www.cnblogs.com/cathsfz/archive/2006/12/10/587925.html

浙公网安备 33010602011771号