可以使项目中的每个页面从一个基类去继承,在这个基类中实现如下的方法和属性。
ServerViewState的定义:
private
StateBag _serverViewState
=
null
;
protected StateBag ServerViewState
{
get
{
if(_serverViewState==null)
{
_serverViewState=new StateBag(this.ViewStateIgnoresCase) ;
}
return _serverViewState;
}
}
protected StateBag ServerViewState
{
get
{
if(_serverViewState==null)
{
_serverViewState=new StateBag(this.ViewStateIgnoresCase) ;
}
return _serverViewState;
}
}
定义ServerViewState序列化后数据的保存路径:
private string ServerViewStatePath
{
get
{
string _strPath = Server.MapPath(Context.Request.ApplicationPath) + "/ServerViewState/"+Session.SessionID+"/";
if(!Directory.Exists(_strPath))
{
Directory.CreateDirectory(_strPath);
}
string _fileName=this.GetType().BaseType.FullName+".ViewState";
_strPath += _fileName;
_strPath = _strPath.Replace('\\','/');
return _strPath;
}
}
保存ServerViewState的方法:
protected
override
object
SaveViewState()
{
if(_serverViewState!=null)
{
object serverViewState=SaveServerViewState();
SavePageServerStateToPersistenceMedium(serverViewState);
}
return base.SaveViewState ();
}
private object GetServerViewStateObject(StateBag serverViewState)
{
ArrayList keyList = null;
ArrayList valueList = null;
if (serverViewState.Count != 0)
{
IDictionaryEnumerator enumerator1 = serverViewState.GetEnumerator();
while (enumerator1.MoveNext())
{
StateItem item1 = (StateItem) enumerator1.Value;
if (keyList == null)
{
keyList = new ArrayList(5);
valueList = new ArrayList(5);
}
keyList.Add(enumerator1.Key);
valueList.Add(item1.Value);
}
if (keyList != null)
{
return new Pair(keyList, valueList);
}
}
return null;
}
protected virtual object SaveServerViewState()
{
if (this._serverViewState != null)
{
return GetServerViewStateObject(this._serverViewState);
}
return null;
}
private void SavePageServerStateToPersistenceMedium( object serverViewState)
{
StringBuilder _sb=new StringBuilder() ;
TextWriter _writer=new StringWriter(_sb);
_formatter.Serialize(_writer,serverViewState) ;
string _strPath=ServerViewStatePath;
if(File.Exists(_strPath))
{
File.Delete(_strPath);
}
FileStream fs=new FileStream(_strPath,FileMode.OpenOrCreate,FileAccess.Write,FileShare.None) ;
using(StreamWriter sw=new StreamWriter(fs))
{
sw.Write(_sb.ToString());
sw.Close() ;
}
fs.Close() ;
}
{
if(_serverViewState!=null)
{
object serverViewState=SaveServerViewState();
SavePageServerStateToPersistenceMedium(serverViewState);
}
return base.SaveViewState ();
}
private object GetServerViewStateObject(StateBag serverViewState)
{
ArrayList keyList = null;
ArrayList valueList = null;
if (serverViewState.Count != 0)
{
IDictionaryEnumerator enumerator1 = serverViewState.GetEnumerator();
while (enumerator1.MoveNext())
{
StateItem item1 = (StateItem) enumerator1.Value;
if (keyList == null)
{
keyList = new ArrayList(5);
valueList = new ArrayList(5);
}
keyList.Add(enumerator1.Key);
valueList.Add(item1.Value);
}
if (keyList != null)
{
return new Pair(keyList, valueList);
}
}
return null;
}
protected virtual object SaveServerViewState()
{
if (this._serverViewState != null)
{
return GetServerViewStateObject(this._serverViewState);
}
return null;
}
private void SavePageServerStateToPersistenceMedium( object serverViewState)
{
StringBuilder _sb=new StringBuilder() ;
TextWriter _writer=new StringWriter(_sb);
_formatter.Serialize(_writer,serverViewState) ;
string _strPath=ServerViewStatePath;
if(File.Exists(_strPath))
{
File.Delete(_strPath);
}
FileStream fs=new FileStream(_strPath,FileMode.OpenOrCreate,FileAccess.Write,FileShare.None) ;
using(StreamWriter sw=new StreamWriter(fs))
{
sw.Write(_sb.ToString());
sw.Close() ;
}
fs.Close() ;
}
读取ServerViewState的方法:
protected
override
void
LoadViewState(
object
savedState)
{
object viewState=LoadPageServerStateFromPersistenceMedium();
if(viewState!=null)
{
this._serverViewState=GetServerViewStateFromObject(viewState);
}
this._serverViewState=null;
base.LoadViewState (savedState);
}
private object LoadPageServerStateFromPersistenceMedium()
{
string _strPath=ServerViewStatePath;
if(!File.Exists(_strPath) )
{
return null;
}
FileStream fs=new FileStream(_strPath,FileMode.Open,FileAccess.Read,FileShare.ReadWrite) ;
string _viewState=null;
using(StreamReader sr=new StreamReader(fs) )
{
_viewState=sr.ReadToEnd() ;
sr.Close() ;
}
fs.Close() ;
File.Delete(_strPath) ;
if(_viewState==null)
{
return null;
}
return _formatter.Deserialize(_viewState) ;
}
private StateBag GetServerViewStateFromObject( object viewState)
{
Pair _pair=viewState as Pair;
if(_pair!=null)
{
StateBag state=new StateBag(this.ViewStateIgnoresCase) ;
ArrayList keyList=_pair.First as ArrayList;
ArrayList valueList=_pair.Second as ArrayList;
for (int i = 0; i < keyList.Count; i++)
{
state.Add((string) keyList[i], valueList[i]);
}
return state;
}
return null;
}
{
object viewState=LoadPageServerStateFromPersistenceMedium();
if(viewState!=null)
{
this._serverViewState=GetServerViewStateFromObject(viewState);
}
this._serverViewState=null;
base.LoadViewState (savedState);
}
private object LoadPageServerStateFromPersistenceMedium()
{
string _strPath=ServerViewStatePath;
if(!File.Exists(_strPath) )
{
return null;
}
FileStream fs=new FileStream(_strPath,FileMode.Open,FileAccess.Read,FileShare.ReadWrite) ;
string _viewState=null;
using(StreamReader sr=new StreamReader(fs) )
{
_viewState=sr.ReadToEnd() ;
sr.Close() ;
}
fs.Close() ;
File.Delete(_strPath) ;
if(_viewState==null)
{
return null;
}
return _formatter.Deserialize(_viewState) ;
}
private StateBag GetServerViewStateFromObject( object viewState)
{
Pair _pair=viewState as Pair;
if(_pair!=null)
{
StateBag state=new StateBag(this.ViewStateIgnoresCase) ;
ArrayList keyList=_pair.First as ArrayList;
ArrayList valueList=_pair.Second as ArrayList;
for (int i = 0; i < keyList.Count; i++)
{
state.Add((string) keyList[i], valueList[i]);
}
return state;
}
return null;
}
这样就可以在每个子页面中就可以直接调用ServerViewState,使用方法与ViewState完全相同,而不用顾虑后台的实现方式。