LoadControlState не уволен - PullRequest
       2

LoadControlState не уволен

1 голос
/ 10 января 2011

У меня проблемы с пользовательским элементом управления (который наследуется от пользовательского элемента управления) - мой LoadControlState не срабатывает.

Ну, если быть точным: он срабатывает нормально, но когда я перезаписываюфункции страницы LoadPageStateFromPersistenceMedium и SavePageStateToPersistenceMedium больше не запускаются.

Существуют ли типичные причины, по которым LoadControlState не запускается, на что мне следует обратить внимание?Есть ли предпосылки для того, когда он будет уволен?

Спасибо

Ответы [ 4 ]

1 голос
/ 11 января 2011

Для чего это стоит, вот как я переопределяю функции Save / LoadPageStateFromPersistenceMedium. По сути, он сохраняет состояние просмотра в сеансе пользователя, чтобы ускорить обратную передачу:

    // Inspired by: http://aspalliance.com/72
    const string ViewStateFieldName = "__VIEWSTATEKEY";
    const string ViewStateKeyPrefix = "ViewState_";
    const string RecentViewStateQueue = "ViewStateQueue";
    const int RecentViewStateQueueMaxLength = 5;

    protected override object LoadPageStateFromPersistenceMedium()
    {
        // The cache key for this viewstate is stored in a hidden field, so grab it
        string viewStateKey = Request.Form[ViewStateFieldName] as string;
        if (viewStateKey == null) return null;

        // Grab the viewstate data using the key to look it up
        return Session[viewStateKey];
    }

    protected override void SavePageStateToPersistenceMedium(object viewState)
    {
        // Give this viewstate a random key
        string viewStateKey = ViewStateKeyPrefix + Guid.NewGuid().ToString();

        // Store the viewstate
        Session[viewStateKey] = viewState;

        // Store the viewstate's key in a 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<string>;
        if (recent == null) Session[RecentViewStateQueue] = recent = new Queue<string>();
        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
            Session.Remove(recent.Dequeue());
    }
0 голосов
/ 18 января 2011

Следующий код исправил это:

    PageStatePersister pageStatePersister;
    protected override PageStatePersister PageStatePersister
    {
        get
        {
            // Unlike as exemplified in the MSDN docs, we cannot simply return a new PageStatePersister
            // every call to this property, as it causes problems
            return pageStatePersister ?? (pageStatePersister = new SessionPageStatePersister(this));
        }
    }
0 голосов
/ 10 января 2011

Что вы возвращаете из реализации LoadPageStateFromPersistenceMedium метода? Вероятно, это должен быть экземпляр System.Web.UI.Pair , инициализированный как данными ViewState, так и данными ControlState:

return new Pair([Restored ControlState], [Restored ViewState]);
0 голосов
/ 10 января 2011

Начиная с .NET 2.0, рекомендуется поместить постоянную логику вашего состояния в пользовательский класс, производный от PageStatePersister .Таким образом, вы можете попробовать принять этот подход.

...