0

我有一个 ASP.NET 页面,我在其中生成一个 Excel 电子表格并在响应中发送它(内容处置标头)。那部分效果很好,但是我有一个永远不会重新启用的按钮,因为原始页面不是响应的一部分。

这是我正在使用的功能:

Public Shared Sub WriteToResponse(ByVal theWorkBook As Workbook, ByVal FileName As String, ByVal resp As HttpResponse)
    Dim theStream As New System.IO.MemoryStream()
    theWorkBook.Save(theStream)

    Dim byteArr As Byte() = DirectCast(Array.CreateInstance(GetType(Byte), theStream.Length), Byte())

    theStream.Position = 0
    theStream.Read(byteArr, 0, CInt(theStream.Length))
    theStream.Close()

    resp.Clear()
    resp.AddHeader("content-disposition", "attachment; filename=" & FileName)
    resp.BinaryWrite(byteArr)
    resp.End()
End Sub

我尝试不清除响应并使用 AppendHeader 而不是 AddHeader,但响应仍然只包含文件。

我错过了什么?我需要使用不同的标题吗?我在 ASP.NET 论坛上发现了这个悬而未决的问题;听起来像我的问题。

4

2 回答 2

2

您不能在同一响应中发回文件和新页面。

我不确定该解决方案如何满足您的特定需求,但请记住,您可以在将文件创建请求发送到服务器之前使用 Javascript 启用或禁用按钮(这样,当电子表格下载开始时用户,按钮已经处于您想要的状态)。

于 2009-08-28T21:32:37.460 回答
2

你不能。您可以通过在单击按钮时打开一个弹出窗口并让弹出窗口提供文件并从 javascript 发回页面来伪造该行为。但是以这种方式,您实际上是在创建 2 个请求和 2 个响应。

更新:如果您想在他们开始下载时禁用该按钮并在下载开始后立即启用它,您实际上无法做到这一点,但您可以使用一些技巧使其看起来像那样。当他们点击下载按钮时,使用一些 javascript 来禁用按钮并创建启动文件流的弹出窗口。当文件流函数 (WriteToResponse) 返回时,在用户会话中设置一些值。同时让原始页面使用 AJAX 轮询服务器以查看是否设置了会话值。如果已设置,则重新启用按钮并将值再次设置为空或 false(因此这是第二次工作)。但这似乎有很多技巧。

但我认为在这种情况下,治疗比问题更糟糕。我假设您想要这个,因为生成文件需要一段时间,并且您不希望用户在准备文件时不耐烦地按下按钮来重置流程。为此,我会在按下按钮时在页面中显示一条弹出消息,说“您的下载正在准备中。这可能需要一分钟。感谢您的耐心等待。(单击以关闭此消息)”

于 2009-08-28T21:33:54.117 回答