Как сохранить значение в обратных передачах для составного элемента управления без использования viewstate
У меня есть составной элемент управления, который имеет пару закрытых полей, которые ссылаются на значения в кэше, и эти закрытые поля вызываются во время метода конструктора. Поскольку строковый ключ используется для идентификации значения в кэше, у меня должен быть способ хранения этого строкового ключа таким образом, чтобы он был доступен во время создания элемента управления, и я должен иметь возможность ссылаться на него в постбэки без него меняются.
Кроме того, этот ключ генерируется при первой загрузке элемента управления, но его не следует менять после этого первого раза.
Как я могу сделать это?
Я уже пытался сохранить его в viewstate, но это не работает, потому что viewstate еще не доступен во время создания элемента управления.
Я попытался использовать личное поле, а затем проверить в конструкторе Page.IsPostback, и если это не обратная передача, я присваиваю значение частному полю, но при последующих обратных передачах оно теряет свое значение, и я не могу переназначить его снова в Page.IsPostBack, потому что это автоматически сгенерированный GUID.
Это должно быть что-то, что люди должны были сделать раньше....
3 ответа
Во время создания элемента управления не так много информации о состоянии, поэтому это может быть сложно. Есть ли какая-то причина, по которой вы не можете переместить свой код, который обращается к информации из кэша, в событие Init элемента управления?
Я предполагаю, что вы не можете использовать Session, потому что сохраненная информация связана с этим конкретным запросом / обратной передачей. Если это не является специфическим для этого запроса, возможно использование Session - но я думаю, что вы можете столкнуться с другими проблемами, пытаясь справиться с состоянием управления на столь раннем этапе жизни.
После просмотра вашего комментария к другому ответу; Вы должны быть в состоянии переместить свой код, который проверяет наличие кэшированного источника данных, в элемент управления Init или даже в событие Load, чтобы состояние было доступно.
Также, кстати; Вы уверены, что вам действительно нужно кэшировать эти данные? Это может в конечном итоге занять много памяти сервера.
Хотя это и не лучшее решение (обычно вы перестраиваете логику в соответствии с моделью жизненного цикла), вы пытались получить прямой доступ к запросу? Однажды я действительно хотел получить выбранное значение из DropDownList в самом начале жизненного цикла, чтобы я мог настроить некоторые элементы в здании, и я сделал это так:
myDropDownList.SelectedValue = Page.Request.Form[myDropDownList.UniqueID];
Таким образом, вместо того, чтобы ждать, пока viewstate загрузит значения прокси на стороне сервера, я просто получил его от управляющего значения на стороне клиента, которое было передано в посте. Я, вероятно, сделал бы вещи по-другому, если бы я изменил дизайн этой страницы, но, похоже, сейчас все получилось, и это решило проблему, с которой я столкнулся.
Вы пробовали сессию?
Вы можете хранить все что угодно в объекте сеанса для одного конкретного пользователя, сохраняя значение / объект между постбеками.
Если вы хотите хранить глобально, а не отдельно, попробуйте приложение