填充的表不返回任何行

时间:2016-01-17 11:11:48

标签: asp.net vb.net html-table

在我正在编写的Web应用程序中,我使用按钮按下填充HTML表格;填充表格后,用户可以单击另一个按钮将表格导出为CSV文件。

问题是,虽然在按下第一个按钮时表格已正确填充,但当应用程序在第二个按钮按下时查询它时,它似乎为空。

一些代码来解释这个问题: ASPX页面中的HTML

<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,但问题是一样的。

我认为我在这里缺少一些基本的东西,不知道是什么。

2 个答案:

答案 0 :(得分:1)

ASP.NET(或web上的任何内容)通过HTTP工作。 HTTP是无状态的。这意味着,当您提出新请求时,无论您在一个请求中执行的操作是完全丢失的。

ASp.NET webforms试图通过使用一个名为ViewState的东西来隐藏它。它本质上是一个隐藏的字段,每当你进行往返时它会来回重新填充你的页面。当服务器重新构建页面时,它会从发送的ViewState中读取信息,并从这些值重建页面。

您遇到的问题是,当您的点击处理程序被触发时,页面还没有重新填充。有两种方法可以解决这个问题。

  1. (首选):不要从UI中的表中读取数据,只需再次在数据库中查找。
  2. 在点击处理程序的页面上设置一个标记,并在PreRender - 事件上填充CSV。

答案 1 :(得分:0)

正如Kenneth所解释的那样,我错误地认为要在请求之间保留信息,而HTTP是无状态的。

所以我从不同的角度对此进行调查,最后我使用View State在本地存储信息并检索它以在按下导出按钮时生成CSV。

所以,存储我使用的信息

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指出我非常基本的误解。