Сохранение webControls в объекте Session - PullRequest
0 голосов
/ 09 февраля 2012

У меня есть панель (pnlPanel) с множеством элементов управления, таких как Textboxes and DropDownLists.Я хочу, чтобы они были постоянными, когда пользователь возвращается на страницу, поэтому я попробовал это:

/*i have saved the panel like this 
  Session["testPanel"] = pnlTest;
*/

protected void Page_Load(object sender, EventArgs e)
{       
    if (Session["testPanel"] != null)
    {
        panel = Session["testPanel"] as Panel;
    }
}

Но это не работает.Является ли это возможным?Причина, по которой я хочу это сделать, заключается в том, что издержки не являются проблемой, и я хочу сократить время кодирования.

Ответы [ 5 ]

1 голос
/ 09 февраля 2012

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

Я бы рекомендовал иметь общий объект, который содержит свойства панели, которую вы хотите, и просто создатьметод в одном из ранних событий, чтобы предварительно заполнить новую панель с этими свойствами.

0 голосов
/ 05 августа 2016

У меня была похожая проблема.Я попытался сохранить объект в состоянии просмотра, в котором сохранена панель, и получил сообщение об ошибке, сообщающее, что панели не сериализуются.Вы можете попробовать использовать SerializationSurrogate.https://msdn.microsoft.com/en-us/library/system.runtime.serialization.iserializationsurrogate(v=vs.110).aspx

0 голосов
/ 09 февраля 2012

То, что вы пытаетесь сделать здесь, - это кэшировать Panel, но это не так.Панель при сохранении является запущенным объектом в памяти и не может быть сохранена как есть.Вам необходимо преобразовать его в строку html, сохранить и кэшировать эту строку.Поэтому рядом с панелью вы размещаете литерал, затем визуализируете панель и сохраняете ее в сеансе, а затем фактически отображаете текст из этого рендера.Я использую некоторый подобный код для настраиваемого управления и настраиваемого кэша, никогда не сохраняю во время сеанса этот объем данных.

0 голосов
/ 09 февраля 2012

Первый подход


protected void Page_Load(object sender, EventArgs e)
{       
    if (ViewState["panel"] != null)
    {
        panel = ViewState["panel"] as Panel;
    }
}

В этом подходе ваши объекты ViewState были другими.Возможно, вы получите некоторые нулевые значения, как только ViewState["panel"] будет выделена управляющая память, и объект будет доступен в впечатление, что сеанс был Session["panel"]


Второй подход


Сохраните панель Complete HTML в базе данных и получите доступ к ней при загрузке формы , сохранив функцию в IsPostBack.

Теперь с непрерывностью подхода - 2 присвойте значение вашему объекту сеанса.

this.Controls.Add(new LiteralControl("Your HTML"));

Третий подход


Вы можете использовать файловую систему.Сохраните div в своем файле и получите доступ к файлу во время выполнения.

Надеюсь, это может вам помочь.


EDIT - 1 => Добавлен код для второго подхода

0 голосов
/ 09 февраля 2012

Не зная всей причины делать что-то подобное, вы должны взглянуть на директивы кэширования вывода.Лучше всего, если вы вытащите содержимое из панели в пользовательский элемент управления.Затем настройте кэширование вывода для элемента управления, используя VaryByCustom, чтобы вы могли использовать имя пользователя или какой-либо другой уникальный идентификатор для разделения по пользователю.

http://msdn.microsoft.com/en-us/library/hdxfb6cy.aspx и http://msdn.microsoft.com/en-us/library/system.web.httpapplication.getvarybycustomstring.aspx

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

Некоторые другие побочные эффекты, подобные этому, включают проблемы с viewstate.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...