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

У меня есть повторитель, который отображает финансовые данные и цены на различные запасы.

На этой странице у меня также есть кнопка "экспорта", которая должна взять данные ~on экран ~ и преобразовать ее в CSV для пользователя.

Проблема, после того, как я свяжу с данными свой список объектов "Запаса":

List<Stock> stocks = GetStocks()
rptStockList.DataSource = stocks;
rptStockList.DataBind();

Данные не сохраняются на обратной передаче.

Кроме того, данные на этой странице постоянно обновляются через UpdatePanel и управление Таймером (повторно связываемый с данными каждый раз). Каждые 30 секунд цены, отображенные для различных запасов в повторителе, управляют изменением.

Теперь, у меня есть linkbutton, который имеет метод события щелчка в коде - позади этого, как, предполагается, экспортирует ~data на экране ~ для пользователя. Я должен захватить текущие значения для списка запасов, в последний раз связанных с данными к повторителю. Я не могу просто пойти, захватывают последние значения от базы данных, потому что они будут изменены во время между последним обновлением.

protected void lbtnExportStocks_Click(object sender, EventArgs e)
{
    // No longer have the stock data used in the repeater control
    ExportStocksToExcel();
}

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

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

Что надлежащее решение к этому типу ситуации? Я должен выполнить итерации через набор "Объектов" Повторителя и восстановить объекты Stock?

7
задан Darwin 1 July 2010 в 18:49
поделиться

4 ответа

Не могли бы вы сохранить акций в Viewstate или в сеансе? например

List<Stock> stocks = GetStocks()
rptStockList.DataSource = stocks;
rptStockList.DataBind();

ViewState.Remove("stocks");
ViewState.Add("stocks", stocks);

private void ExportStocksToExcel
{
    List<Stock> persistedStocks;

    persistedStocks = (List<Stock>)Page.ViewState["stocks"];
    ...
}

Состояние сеанса на самом деле может быть лучшим выбором для хранения акций , поскольку оно не будет передано клиенту на странице (со всеми возможными «творческими редактированием», которые могут повлечь за собой) - это, вероятно, довольно важно в таком приложении. (Да, вы можете зашифровать Viewstate, но с учетом этих пиковых значений, которые могут вам не понадобиться.)

1
ответ дан 7 December 2019 в 18:39
поделиться

Похоже, что в вашем методе Page_Load вы выполняете какую-то привязку к вашему ретранслятору. Для ваших целей это плохо, и, как вы видели, ваши данные будут теряться при каждой обратной передаче. Можете ли вы убедиться, что ваша страница Page_Load похожа на это? :

Page_Load(...){
  if (! Page.IsPostBack){
    //first time page loads do this block

    //stuff
    //databinding stuff
  }
}
0
ответ дан 7 December 2019 в 18:39
поделиться

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

Например:

<ItemTemplate>
    Symbol: <input type="text" readonly="readonly" name="Symbol" value="<%# Container.DataItem("Symbol") %> />
    Quote: <input type="text" readonly="readonly" name="Quote" value="<%# Container.DataItem("Quote") %> />
</ItemTemplate>

Клиент отправляет каждое входное значение с именем «Символ» в массиве (а также входные значения с именем «Цитата»), к которым вы можете получить доступ в своем коде программной части следующим образом:

protected void lbtnExportStocks_Click(object sender, EventArgs e) {

    // They come out as comma-delimited strings
    string[] symbols = Request.Form["Symbol"].Split(',');
    string[] quotes  = Request.Form["Quote"].Split(',');

    // ... continue exporting stocks to Excel
}

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

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

1
ответ дан 7 December 2019 в 18:39
поделиться

Я бы либо взял ответ Фила и сериализовал бы весь набор данных, либо создал бы какой-то объект критериев, который передается в GetStocks (), чтобы указать, какие данные нужно получить. Затем сериализуйте и сохраните объект критериев в ViewState, чтобы, когда пользователь нажимает «Экспорт», вы могли извлечь критерии и получить те же данные.

то есть

[Serializable]
public class StockCriteria
{
    public DateTime DateFrom { get; set; }
    public DateTime DateTo { get; set; }
    public string[] Symbols { get; set; }
}

, а затем GetStocks () имеет StockCriteria в качестве параметра и на его основе создает свой запрос.

0
ответ дан 7 December 2019 в 18:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: