2016-01-17 1 views
0

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

Проблема заключается в том, что, хотя таблица правильно заполняется при первой нажатии кнопки, она кажется пустой, когда приложение запрашивает ее при второй кнопке.

Несколько код для объяснения вопроса: HTML, в ASPX странице

<asp:Button ID="BTNPopulate" runat="server" Text="Populate" /> 
<table id="Table1" style="border-width: 1px; border-color: Black; padding: 5px" cellspacing="0" runat="server" /> 
<asp:Button ID="BTNExport" runat="server" Text="Export" /> 

теперь первой кнопки

Protected Sub BTNTest_Click(sender As Object, e As EventArgs) Handles BTNTest.Click 
Dim row As HtmlTableRow 
     Dim cell As HtmlTableCell 
     row = New HtmlTableRow() 
     row.BgColor = "Gray" 
     cell = New HtmlTableCell() 
     cell.Controls.Add(New LiteralControl("Test cell")) 
     row.Cells.Add(cell) 
     Table1.Rows.Add(row) 
end sub 

и таблицы правильно заполнены. я не смог получить какую-либо информацию от него и в самом деле, если я называю .Rows.Count метода в любом случае во второй кнопке мыши фонового код

Protected Sub BTNExport_Click(sender As Object, e As EventArgs) Handles BTNExport.Click 

    Response.ContentType = "text/csv" 
    Response.AddHeader("Content-Disposition", "attachment; filename='PFExport.csv'") 

    CSVBuilder.Append(Table1.Rows.Count) 

    Response.Write(CSVBuilder.ToString) 
    Response.Flush() 
    Response.End() 
End Sub 

результата в файле всегда равен 0. С другой стороны, если я назову то же самое свойство .Rows.Count в конце заполняемой части кода, он правильно вернет результат. Я попытался использовать ASPTable вместо HTMLTable, но проблема такая же.

Я предполагаю, что у меня что-то не хватает, не знаю, что.

ответ

1

ASP.NET (или что-либо в сети ftm) работает через HTTP. HTTP не имеет статуса. Это означает, что все, что вы делаете в одном запросе, полностью потеряно, когда вы делаете новый запрос.

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

Проблема, с которой вы сталкиваетесь, заключается в том, что страница не повторно заселена при срабатывании вашего обработчика кликов. Есть два способа исправить это.

  1. (предпочтительно): вместо чтения данных из таблицы в пользовательском интерфейсе просто загляните в базу данных еще раз.
  2. Установите флаг на странице в обработчике кликов и заполните CSV на PreRender -эвенте.
+0

Уважаемый Кеннет, большое спасибо за вашу помощь. К сожалению, один способ невозможен, поскольку возвращаемые данные являются случайными, поэтому они действительно не повторяемы. Могу ли я попросить вас немного рассказать о второй возможности? – lucamauri

0

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

Таким образом, я исследую это с помощью другого perspecitve, и я закончил использование состояния View, чтобы локально хранить информацию и извлекать ее для создания CSV при нажатии кнопки Export.

Таким образом, чтобы хранить информацию я использую

ViewState("TableResultsState") = CSVBuilder.ToString 

сразу после того, как таблица заполняется.

Для кнопки экспорта, я

With Response 
    .ContentType = "text/csv" 
    .AddHeader("Content-Disposition", "attachment; filename='PFExport.csv'") 
    .Write(ViewState("TableResultsState").ToString) 
    .Flush() 
    .End() 
End With 

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

Опять же, спасибо Kenneth за указание на мое самое основное недоразумение.