ASP.Net: Почему изменения, которые я делаю в Viewstate в управляющем событии, недоступны для последующих обратных передач? - PullRequest
1 голос
/ 24 февраля 2009

Я пишу пользовательский элемент управления в ASP.Net 3.5 WebForms, используя ASP.Net AJAX. Я строю состояние переключения в режим управления (расширенный и свернутый режимы). Я пытался сохранить текущее состояние элемента управления в ViewState, изменив его вручную в обработчике событий на стороне сервера:

object oExpanded = ViewState[ "Expandedness" ];
if(oExpanded == null)
{
    oExpanded = ListState.Collapsed;
}
ListState lsCurrentState = (ListState) oExpanded;
if(lsCurrentState == ListState.Collapsed)
{
    //code snipped - move to expanded mode here
    ViewState[ "Expandedness" ] = ListState.Expanded;
}
else
{
    //code snipped - move to collapsed mode here
    ViewState[ "Expandedness" ] = ListState.Collapsed;
}

Я не думаю, что это должно иметь значение, но фактический рендеринг происходит в панели обновления, а код выше находится в обработчике событий, который запускается асинхронно. У меня проблема в том, что при следующей обратной передаче ViewState["Expandedness"] возвращает ноль. Я пытался использовать инструмент Viewstate Decoder от Fritz Onion, чтобы посмотреть фактическое содержимое viewstate между постбеками, но он говорит мне, что сериализованные данные недействительны.

Я ошибся подходом? Как правильно решить эту проблему?

Ответы [ 3 ]

1 голос
/ 25 февраля 2009

Вы правы, что все в порядке, если он находится в UpdatePanel - это не должно иметь никакого значения.

Я подозреваю, что ViewState отключен либо для вашего элемента управления, либо для одного из его родителей: если он отключен для любого из родителей (вплоть до страницы), он будет отключен для вашего элемента управления.

Чтобы обойти это, вы можете использовать словарь ViewState страницы вместо того, что находится в вашем элементе управления.

т.е. вместо того чтобы сказать:

this.ViewState[ "Expandedness" ] = ListState.Expanded;

говорят:

this.Page.ViewState[ "Expandedness" ] = ListState.Expanded;

Если возможно, что на странице имеется более одного экземпляра вашего элемента управления, вам необходимо убедиться, что ключ ViewState уникален, возможно, так:

this.Page.ViewState[ this.ClientID + "Expandedness" ] = ListState.Expanded;

В качестве альтернативы (это будет работать, даже если ViewState отключен для страницы), вы можете рассмотреть возможность расширения в ControlState. Это немного сложнее, но Google, и вы найдете пример кода довольно быстро. Рекомендуется хранить только абсолютный минимум информации в ControlState, но единственный флаг, подобный этому, подходит (и на самом деле для чего он предназначен, на самом деле).

0 голосов
/ 25 февраля 2009

Дальнейшее исследование: изменения в Viewstate, которые я делаю в обработчике события субуправления, сохраняются до тех пор, пока Page_Prerender (т. Е. Позже в жизненном цикле события страницы), поэтому проблема не в том, что Viewstate не получает написано Но любые последующие обратные передачи на страницу - синхронные или асинхронные - не показывают это значение в viewstate.

0 голосов
/ 25 февраля 2009

когда вы вызываете этот код? если он вызывается в Page_Init, это слишком рано, и любые изменения, внесенные вами в viewstate, будут игнорироваться.

Просто мысль

...