Альтернатива ViewState - PullRequest
       4

Альтернатива ViewState

2 голосов
/ 28 октября 2010

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

Ответы [ 5 ]

2 голосов
/ 28 октября 2010

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

Кроме того, если вы не используете SessionPageStatePersister (или другой сервер сохраняются) или шифруете ViewState, пользователь все еще может изменить ViewState. Это может быть сложнее, но все же возможно. По умолчанию ViewState использует HiddenFieldPageStatePersister и сохраняет ViewState в скрытом поле на каждой странице (в виде закодированной строки). Просто стоит подумать.

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

Сессия, вероятно, ваша лучшая ставка. Мы должны использовать сеанс для хранения некоторой пользовательской информации, но столкнулись с ошибкой из-за слишком раннего доступа к ней. Ошибка [HttpException]: Session state has created a session id, but cannot save it because the response was already flushed by the application." Но она часто проявляется как PageRequestMangerParserErrorException. Супер весело охотиться на это. Одно хакерское исправление - записать в свой код Global.asax:

public Session_Start(object sender, EventArgs e)
{
    string sessionId = Session.SessionID;
}

Доступ к SessionID заставляет механизм ASP.NET собирать сеанс раньше, чем обычно, что делает возможным его раннее использование.

Вне сеанса (или приложения) у вас есть два других варианта: клиентское хранилище и постоянное хранилище. Последний - это причудливый способ сказать «запихнуть в базу данных», хотя, конечно, существуют и аналогичные альтернативы.

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

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

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

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

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

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

В зависимости от области действия: Сессия или Приложение

Сессия
Если вы хотите, чтобы данные хранились для пользователя

Приложение
Если вы хотите, чтобы сохраненные данные были доступны для всех пользователей

...