应用场景:
在给客户开发一个asp.net工作流系统时,因为某些Form内容过长,客户提出要求在对Form的编辑过程中随时能够保存当前输入,并且能随时恢复保存时的状态。因为form的提交有严格的验证代码,因此保存不能执行验证,而不经过验证的代码不能保存到系统数据库中。如果用临时表存储又显麻烦,代码量会增加很多,同时可能导致系统产生新的bug.
解决方案产生过程:
首先想到的就是通过保存Page的ViewState,然后在恢复的时候用保存过的ViewState来替换。可以通过重写Page的如下两个方法来实现:
protected override void SavePageStateToPersistenceMedium(object viewState)
protected override object LoadPageStateFromPersistenceMedium()
这样是可以恢复保存时的Page的ViewState,但是IsPostBack状态在第一次访问页面的时候仍然是false,这样虽然可以恢复保存过的viewstate,但是无法置IsPostBack为true,从而导致Page仍然按照非PostBack来执行从而无法达到恢复状态的目的。本想就此放弃,但是同事给我推荐了codeproject.com上的一篇文章 http://www.codeproject.com/aspnet/PersistentStatePage.asp
看过之后知道了如何置PostBack状态,那就是重写DeterminePostBackMode()方法,这样我们在保存页面的状态的时候不仅保存ViewState而且保存DeterminePostBackMode()返回值,在恢复页面的时候不仅恢复ViewState,同时重写DeterminePostBackMode()方法,返回我们保存页面状态时保存的DeterminePostBackMode()所返回的NameValueCollection,这样恢复页面的时候就可以置IsPostBack为ture了,这样目标就基本实现了,可以很轻松的将一个Page在首次访问的时候就将其置为保存时的状态,并可以从这一状态继续往下操作(接下来的PostBack都会正常运转)
在我的示例代码中,可以看到我还保存了Request.Form,这是因为考虑到一些非ASP.NET Server Control的值都会在Request.Form,这样恢复了Request.Form就不会在页面恢复后PostBack的时候丢失这一类值(这里对Request.Form的恢复可以称之为假恢复)。
这样我的目标就实现了,但是codeproject.com上的这篇文章所附代码比我的更复杂,完成的恢复也更多,甚至恢复了QueryString,但是不适合我的应用要求,于是我做了一个适合我的应用要求的例子:
http://www.cnblogs.com/Files/bestcomy/PageStatePersistAndRestore.rar