Tip on Getting ViewState past Some Proxies

Yet another tip on viewstate from a reader of mine, Cliff Harker.  Basically, there are some proxies out there, including AOL apparently, that cut off any hidden fields that are greater than some size.  This obviously screws up viewstate, so this code breaks viewstate up into multiple smaller fields to get around this problem:

protected override object LoadPageStateFromPersistenceMedium()
{
  LosFormatter format = new LosFormatter();

  int cnt = Convert.ToInt32(Request["__VIEWSTATE0"].ToString());
  StringBuilder s = new StringBuilder();

  for (int i = 1; i <= cnt; i++) {
    s.Append(Request["__VIEWSTATE" + i.ToString()].ToString());
  }

  return format.Deserialize(s.ToString());
}

protected override void SavePageStateToPersistenceMedium(object viewState)
{
  LosFormatter format = new LosFormatter();
  StringWriter writer = new StringWriter();
  format.Serialize(writer, viewState);
  StringBuilder s = new StringBuilder(writer.ToString());

  int cnt = 1;
  int left = s.Length;

  while( left > 0 ) {
    //Change to any value other than 1000 as necessary
    int cut = (left > 1000) ? 1000 : left;

    RegisterHiddenField("__VIEWSTATE" + cnt.ToString(),
    s.ToString().Substring(0,cut));

    s = s.Remove(0,cut);

    left -= cut;
    cnt++;
  }
  cnt--;

  RegisterHiddenField("__VIEWSTATE0", cnt.ToString());
  RegisterHiddenField("__VIEWSTATE", "");
}

No Comments