【问题标题】:A populated Table returns no rows填充的表不返回任何行
【发布时间】:2016-04-22 14:47:59
【问题描述】:

在我正在编写的 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,但问题是一样的。

我想我在这里遗漏了一些基本的东西,不确定是什么。

【问题讨论】:

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


    【解决方案1】:

    ASP.NET(或网络 ftm 上的任何东西)通过 HTTP 工作。 HTTP 是无状态的。这意味着当您提出新请求时,您在一个请求中所做的任何事情都会完全丢失。

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

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

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

    【讨论】:

    • 亲爱的肯尼斯,非常感谢您的帮助。不幸的是1方式不可行,因为返回的数据是随机的,所以它们真的不可重复。能否请您详细说明第二种可能性?
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-24
      • 1970-01-01
      • 1970-01-01
      • 2015-08-26
      • 2023-03-19
      相关资源
      最近更新 更多