有时候我们在页面返回、跳转、多步注册的时候,经常需要保存某个页面的状态,以便需要的时候进行加载。例如下情况:

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 *************************************************************************************************************************/  
posted on 2010-07-06 09:00  代岳强  阅读(492)  评论(0编辑  收藏  举报