I\'m trying to get asp.net to store viewstate in the session rather than bulking up the html.
Now i\'ve read that asp.net comes with the SessionPageStatePersister wh
For what it's worth, here's the code i ended up using to solve the big-picture problem at hand: moving viewstate out of the html. Just pop this into your mypage.aspx.cs:
// Inspired by: http://aspalliance.com/72
const string ViewStateFieldName = "__VIEWSTATEKEY";
const string RecentViewStateQueue = "RecentViewStateQueue";
const int RecentViewStateQueueMaxLength = 5;
protected override object LoadPageStateFromPersistenceMedium()
{
// The cache key for this viewstate is stored where the viewstate normally is, so grab it
string viewStateKey = Request.Form[ViewStateFieldName] as string;
if (viewStateKey == null) return null;
// Grab the viewstate data from the cache using the key to look it up
string viewStateData = Cache[viewStateKey] as string;
if (viewStateData == null) return null;
// Deserialise it
return new LosFormatter().Deserialize(viewStateData);
}
protected override void SavePageStateToPersistenceMedium(object viewState)
{
// Serialise the viewstate information
StringBuilder _viewState = new StringBuilder();
StringWriter _writer = new StringWriter(_viewState);
new LosFormatter().Serialize(_writer, viewState);
// Give this viewstate a random key
string viewStateKey = Guid.NewGuid().ToString();
// Store the viewstate in the cache
Cache.Add(viewStateKey, _viewState.ToString(), null, Cache.NoAbsoluteExpiration, TimeSpan.FromMinutes(Session.Timeout), CacheItemPriority.Normal, null);
// Store the viewstate's cache key in the viewstate hidden field, so on postback we can grab it from the cache
ClientScript.RegisterHiddenField(ViewStateFieldName, viewStateKey);
// Some tidying up: keep track of the X most recent viewstates for this user, and remove old ones
var recent = Session[RecentViewStateQueue] as Queue;
if (recent == null) Session[RecentViewStateQueue] = recent = new Queue();
recent.Enqueue(viewStateKey); // Add this new one so it'll get removed later
while (recent.Count > RecentViewStateQueueMaxLength) // If we've got lots in the queue, remove the old ones
Cache.Remove(recent.Dequeue());
}
And for a super-simple way of using the SessionPageStatePersister, again put this in your mypage.aspx.cs:
protected override PageStatePersister PageStatePersister
{
get
{
return new SessionPageStatePersister(this);
}
}