我有一个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,但响应仍然只包含文件。
我错过了什么?我需要使用不同的标题吗?我找到了unanswered question on the ASP.NET forums;听起来像我的问题。
答案 0 :(得分:2)
您无法在同一回复中发回文件和新页面。
我不确定该解决方案如何满足您的特定需求,但请记住,您可以使用Javascript启用或禁用之前的按钮将文件创建请求发送到 / em>服务器(这样,在用户开始下载电子表格时,按钮已经处于您想要的状态)。
答案 1 :(得分:2)
你做不到。您可以通过单击按钮打开弹出窗口并让弹出窗口提供文件并从javascript回发页面来伪造行为。但是通过这种方式,您可以有效地创建2个请求,包含2个响应。
更新:如果您想在开始下载时禁用该按钮,并在下载开始后立即启用该按钮,您就无法真正做到这一点,但您可以使用一些技巧使它看起来像这样。当他们点击下载按钮时,使用一些javascript来禁用该按钮并创建启动文件流的弹出窗口。当文件流功能(WriteToResponse)返回时,在用户会话中设置一些值。同时,原始页面使用AJAX轮询服务器以查看是否设置了会话值。如果设置了重新启用按钮并再次将值设置为空或假(这样第二次工作)。但这似乎有很多伎俩。
但我认为在这种情况下治愈比问题更糟糕。我假设您想要这个,因为生成文件需要一段时间,并且您不希望用户在准备文件时不耐烦地按下按钮来重置流。为了做到这一点,我只会在按下按钮的页面中显示一条弹出消息,上面写着“您的下载正在准备中。这可能需要一分钟。感谢您的耐心等待。(点击忽略此消息)”