Как сохранить данные через постбэки? - PullRequest
9 голосов
/ 12 сентября 2011

Я работаю на веб-сайте ASP.NET/C#.

Я читаю данные из базы данных, сохраняю их в словаре

Dictionary<string, decimal> Results

, а затем привязать его к диаграмме ASP.NET

PieChart.Series["Series"].Points.DataBind(Results, "Key", "Value", string.Empty);  

Я хочу изменить метку точки при нажатии кнопки.

protected void Button_Click(object sender, EventArgs e)
{
    PieChart.Series["Series"].Points[0].Label = "abc"
}

Но проблема, когда я нажимаю кнопку, возникает постбэк, и данные, сохраненные в словаре «Результаты», теряются вместе с диаграммой.

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

Спасибо за любую помощь.

Ответы [ 6 ]

10 голосов
/ 12 сентября 2011

Да Используйте ViewState для сохранения данных между обратными передачами.

public Dictionary<string, decimal> Results
{ 
  get { return ViewState["Results"]; }
  set { ViewState["Results"] = value; }
}

Примечание: Проверьте значение Null для viewstate, в противном случае будет выдано исключениеили ошибка

4 голосов
/ 12 сентября 2011

Некоторые респонденты предложили хранить данные в ViewState. Хотя это является обычным в ASP.NET, вам необходимо убедиться, что вы абсолютно точно понимаете последствия, если хотите пойти по этому пути, поскольку это может реально снизить производительность. С этой целью я бы порекомендовал прочитать НАСТОЯЩЕЕ понимание ViewState .

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

3 голосов
/ 12 сентября 2011

Вы можете поместить данные в ViewState или Session, чтобы затем иметь возможность вытащить их «на другую сторону».

1 голос
/ 12 сентября 2011

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

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

Фактически, поскольку вы меняете только отображаемую информацию, и, исходя из вашего вопроса, я не верю, что вы действительно обрабатываете эти данные в любомКстати, мне кажется, что это действительно работа для какого-то javascript рядом с вашей страницей ASP.NET.Я никогда не делал этого, но некоторые базовые поиски в Google действительно обнаружили некоторые статьи об этом.

0 голосов
/ 07 марта 2017

Я часто использую asp: HiddenField для хранения небольших объемов незащищенных данных на стороне клиента.

В функции Page_Load () вы можете установить значение скрытого поля, а затем прочитать его обратно в функциях, которые вызываются позже.

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

0 голосов
/ 13 октября 2012

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

...