有时候我们在页面返回、跳转、多步注册的时候,经常需要保存某个页面的状态,以便需要的时候进行加载。例如下情况:
1、主页面为查询页面,选择完查询条件后显示出结果列表,点击某一条后进行单条处理,处理完毕后返回查询页面,而此页面又需要显示上次的浏览结果。通常的做法是将上一次的查询条件保存下来,在返回此页面的时候重新加载数据,但是这样有些问题:有些复杂查询可能很耗时;有些查询条件很多,保存的时候很繁琐。
2、多步操作后,突然又想返回之前某个结果页面,用js脚本去控制它的histroy的时候可能会很麻烦。
我们是否可以将页面的状态保存到Session(或者序列化到数据库中)里,当需要的时候重新恢复这个页面呢?虽说存储到Session里浪费了服务器资源,但如果存储的较少且要求不很高这却是一个可以大大简化我们应用的办法。经过搜索网上一些相关资料,同时分析asp.net的生命周期,将多人的思想整理在一起,我得出下面一个基类,可简化上述问题处理。这里提供源码以及示例(包括VS2003和VS2005)的下载,具体实现可参考代码以及注释。
状态保存的基类如下,保存状态的页面需要继承此类,如果项目中已经有其他页面基类,可将此类修改,让其先继承于你项目中的基类。
001 |
using System;
|
002 |
using System.Web;
|
003 |
using System.Web.SessionState;
|
004 |
using System.Web.UI;
|
005 |
/// <summary> |
006 |
/// 页面状态持久化。可保存和恢复页面的ViewState和表单内容 |
007 |
/// </summary> |
008 |
public class PersistencePage : System.Web.UI.Page
|
009 |
{ |
010 |
|
011 |
/// <summary>
|
012 |
/// 是否从Session中恢复状态(此值来控制LoadPageStateFromPersistenceMedium的取值规则以及回发事件RaisePostBackEvent执行与否,防止状态恢复时重复执行控件事件)
|
013 |
/// </summary>
|
014 |
private bool taoist_IsLoadPageStateFromToSession = false;
|
015 |
|
016 |
/// <summary>
|
017 |
/// 页面状态保存到的Session
|
018 |
/// </summary>
|
019 |
private string taoist_PageStateSession = "";
|
020 |
|
021 |
/// <summary>
|
022 |
/// 保存页面状态(包括ViewState和表单内容)
|
023 |
/// </summary>
|
024 |
/// <param name="sessionName">存储页面状态的session</param>
|
025 |
protected void SavePageStateToSession(string sessionName)
|
026 |
{
|
027 |
|
028 |
this.taoist_PageStateSession = sessionName;
|
029 |
object state = base.LoadPageStateFromPersistenceMedium();
|
030 |
|
031 |
//保存ViewState与表单内容
|
032 |
Pair ps = new Pair();
|
033 |
ps.First = state;
|
034 |
ps.Second = base.DeterminePostBackMode();
|
035 |
Session[sessionName] = ps;
|
036 |
}
|
037 |
|
038 |
/// <summary>
|
039 |
/// 重写此方法,如果是从Session中恢复状态则无需触发控件事件
|
040 |
/// </summary>
|
041 |
/// <param name="sourceControl"></param>
|
042 |
/// <param name="eventArgument"></param>
|
043 |
protected override void RaisePostBackEvent(IPostBackEventHandler sourceControl, string eventArgument)
|
044 |
{
|
045 |
if (!taoist_IsLoadPageStateFromToSession)
|
046 |
{
|
047 |
base.RaisePostBackEvent(sourceControl, eventArgument);
|
048 |
}
|
049 |
}
|
050 |
|
051 |
/// <summary>
|
052 |
/// 重写此方法,只有taoist_IsLoadPageStateFromToSession为true时才从Session中还原ViewState。
|
053 |
/// </summary>
|
054 |
/// <returns></returns>
|
055 |
protected override object LoadPageStateFromPersistenceMedium()
|
056 |
{
|
057 |
object state;
|
058 |
|
059 |
if (taoist_IsLoadPageStateFromToSession)
|
060 |
{
|
061 |
//还原ViewState
|
062 |
Pair ps = (Pair)Session[taoist_PageStateSession];
|
063 |
state = ps.First;
|
064 |
//清空当前Session,保证只能恢复一次,防止无效恢复
|
065 |
Session[taoist_PageStateSession] = null;
|
066 |
}
|
067 |
else |
068 |
state = base.LoadPageStateFromPersistenceMedium();
|
069 |
|
070 |
return state;
|
071 |
}
|
072 |
|
073 |
/// <summary>
|
074 |
/// 重载此方法,增加表单恢复,并设置是否恢复Session
|
075 |
/// </summary>
|
076 |
/// <returns></returns>
|
077 |
protected override System.Collections.Specialized.NameValueCollection DeterminePostBackMode()
|
078 |
{
|
079 |
|
080 |
System.Collections.Specialized.NameValueCollection formContent = base.DeterminePostBackMode();
|
081 |
|
082 |
if (formContent == null)
|
083 |
{
|
084 |
//判断是否返回
|
085 |
if (Request.QueryString["taoist_PageStateSession"] != null)
|
086 |
{
|
087 |
taoist_PageStateSession = Convert.ToString(Request.QueryString["taoist_PageStateSession"]);
|
088 |
if (Session[taoist_PageStateSession] != null && !taoist_PageStateSession.Equals(""))
|
089 |
{
|
090 |
//设置需要还原ViewState
|
091 |
this.taoist_IsLoadPageStateFromToSession = true;
|
092 |
|
093 |
//先还原表单
|
094 |
Pair ps = Session[taoist_PageStateSession] as Pair;
|
095 |
if (ps != null)
|
096 |
{
|
097 |
formContent = ps.Second as System.Collections.Specialized.NameValueCollection;
|
098 |
}
|
099 |
}
|
100 |
|
101 |
}
|
102 |
}
|
103 |
|
104 |
return formContent;
|
105 |
}
|
106 |
|
107 |
} |
108 |
/******************************************************************************************************************** |
109 |
* 说 明:需要保存状态的页面需要继承此类,使用方法如下:
|
110 |
*
|
111 |
1、保存状态时使用SavePageStateToSession方法,例子:
|
112 |
private void Button2_Click(object sender, System.EventArgs e)
|
113 |
{
|
114 |
this.SavePageStateToSession("mypagestate");
|
115 |
Response.Redirect("WebForm2.aspx");
|
116 |
}
|
117 |
mypagestate 为要将页面状态保存到的Session的名称
|
118 |
|
119 |
2、恢复状态需向页面传递taoist_PageStateSession参数,例子
|
120 |
private void Button1_Click(object sender, System.EventArgs e)
|
121 |
{
|
122 |
Response.Redirect("WebForm1.aspx?taoist_PageStateSession=mypagestate");
|
123 |
}
|
124 |
参数名为taoist_PageStateSession,其值为要恢复WebForm1.aspx页面所使用的Session
|
125 |
*
|
126 |
*************************************************************************************************************************/ |