Getting asp.net to store viewstate in the session rather than bulking up the html

后端 未结 3 589
悲哀的现实
悲哀的现实 2020-12-18 00:53

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

3条回答
  •  不知归路
    2020-12-18 01:00

    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);
        }
    }
    

提交回复
热议问题