Как сохранить значение в обратных передачах для составного элемента управления без использования viewstate - PullRequest
0 голосов
/ 29 октября 2010

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

Кроме того, этот ключ генерируется при первой загрузке элемента управления, но его не следует менять после этого первого раза.

Как мне это сделать?

Я уже пытался сохранить его в viewstate, но это не работает, потому что viewstate еще не доступен в момент создания элемента управления.

Я попытался использовать приватное поле, а затем проверить его в Page.IsPostback в конструкторе, и, если это не обратная передача, я назначаю значение закрытому полю, но при последующих обратных передачах оно теряет свое значение, и я снова переназначить его в Page.IsPostBack, потому что это автоматически сгенерированный GUID.

Это должно быть что-то, что люди должны были делать раньше ....

Ответы [ 3 ]

0 голосов
/ 30 октября 2010

Во время создания элемента управления не так много информации о состоянии, поэтому это может быть сложно.Есть ли какая-то причина, по которой вы не можете переместить свой код, который обращается к информации из кэша, в событие Init элемента управления?

Я предполагаю, что вы не можете использовать Сеанс, потому что сохраненная информация связана с этим конкретным запросом / обратной передачей.Если это не является специфическим для этого запроса, возможно использование Session - но я думаю, что вы можете столкнуться с другими проблемами, пытаясь разобраться с состоянием управления на столь раннем этапе жизни.другой ответ;вы должны быть в состоянии переместить свой код, который проверяет наличие кэшированного источника данных, в элемент управления Init или даже в событие Load, так что состояние будет доступно.

Также, кстати;Вы уверены, что вам действительно нужно кэшировать эти данные?Это может в конечном итоге занять много памяти сервера.

0 голосов
/ 08 ноября 2010

Несмотря на то, что это не лучшее решение (обычно вы перестраиваете логику в соответствии с моделью жизненного цикла), вы пытались получить прямой доступ к запросу?Однажды я действительно хотел получить выбранное значение из DropDownList в самом начале жизненного цикла, чтобы я мог настроить некоторые элементы в здании, и я сделал это так:

myDropDownList.SelectedValue = Page.Request.Form[myDropDownList.UniqueID];

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

0 голосов
/ 30 октября 2010

Вы пробовали Сеанс ?

Вы можете хранить все, что вам нравится, в объекте сеанса для одного конкретного пользователя, сохраняя значение / объект между постбэками.Вы хотите хранить в глобальном масштабе, а не отдельно, попробуйте Приложение

...