asp.net 处理原文件中过长的viewstate代码

复制代码 代码如下:

  public class XVPage : Page

  {

  static private DirectoryInfo _Dir;

  private DirectoryInfo Dir

  {

  get

  {

  if (_Dir == null)

  {

  _Dir = new DirectoryInfo(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "App_Data"));

  if (!_Dir.Exists)

  _Dir.Create();

  _Dir = new DirectoryInfo(Path.Combine(_Dir.FullName, "ViewState"));

  if (!_Dir.Exists)

  _Dir.Create();

  }

  return _Dir;

  }

  }

  protected override object LoadPageStateFromPersistenceMedium()

  {

  PageStatePersister ps = this.PageStatePersister;

  ps.Load();

  if (ps.ControlState != null)

  ps.ControlState = AntiSerialization((string)ps.ControlState);

  if (ps.ViewState != null)

  ps.ViewState = AntiSerialization((string)ps.ViewState);

  return new Pair(ps.ControlState, ps.ViewState);

  }

  protected override void SavePageStateToPersistenceMedium(object state)

  {

  PageStatePersister ps = this.PageStatePersister;

  if (state is Pair)

  {

  Pair pair = (Pair)state;

  ps.ControlState = pair.First;

  ps.ViewState = pair.Second;

  }

  else

  {

  ps.ViewState = state;

  }

  if (ps.ControlState != null)

  ps.ControlState = AntiSerialization(ps.ControlState);

  if (ps.ViewState != null)

  ps.ViewState = AntiSerialization(ps.ViewState);

  ps.Save();

  }

  private object AntiSerialization(string stateID)

  {

  string stateStr = (string)Cache[stateID];

  string file = Path.Combine(Dir.FullName, stateID);

  if (stateStr == null)

  stateStr = File.ReadAllText(file);

  else

  Cache.Remove(stateID);

  return new ObjectStateFormatter().Deserialize(stateStr);

  }

  private string AntiSerialization(object obj)

  {

  string value = new ObjectStateFormatter().Serialize(obj);

  string stateID = (DateTime.Now.Ticks + (long)value.GetHashCode()).ToString(); //产生离散的id号码

  File.WriteAllText(Path.Combine(Dir.FullName, stateID), value);

  Cache.Insert(stateID, value);

  return stateID;

  }

  protected override void OnUnload(EventArgs e)

  {

  base.OnUnload(e);

  DateTime dt = DateTime.Now.AddMinutes(-20);

  foreach (FileInfo fl in Dir.GetFiles())

  if (fl.LastAccessTime < dt)

  try

  {

  fl.Delete();

  }

  catch

  {

  }

  }

  }

  只需要在页面后台中继承XVPage 就可以了

  public partial class Index_Content : XVPage