2009-08-28 74 views
0

我有一个ASP.NET页面,我在这里生成一个Excel电子表格,并在响应(content-disposition header)中发送它。该部分效果很好,但我有一个永远不会重新启用的按钮,因为原始页面不是响应的一部分。如何在HTTP响应中发送文件和页面?

下面是我使用的功能:

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 

我试着不清除响应并使用替代的AddHeader AppendHeader,但反应仍然只包含文件。

我错过了什么?我需要使用不同的标题吗?我发现这个unanswered question on the ASP.NET forums;听起来像我的问题。

回答

2

你不能。您可以通过点击按钮打开一个弹出框来伪造该行为,并让弹出窗口提供该文件并从javascript回发页面。但通过这种方式,您可以有效地创建2个请求并提供2个响应。

更新:如果你想,当他们开始下载禁用按钮,并尽快使其作为下载开始,你不能真正做到这一点,但你可以使用一些弄虚作假,使其看起来像。当他们点击下载按钮时,使用一些JavaScript来禁用按钮并创建启动文件流的弹出窗口。当文件流功能(WriteToResponse)返回在用户会话中设置某个值时。同时,原始页面使用AJAX轮询服务器以查看是否设置了会话值。如果它的设置重新启用按钮,并重新设置为空值或假(所以这个工作的第二次)。但这似乎是一大堆技巧。

,但我认为在这种情况下,治愈是再厉害的问题。我想,你希望这是因为生成的文件需要一段时间,你不希望用户同时正在编写的文件不耐烦地按下按钮,复位流量。要做到这一点,我只想显示按下按钮的页面弹出一个消息,说什么“正在准备您的下载。这可能需要一分钟。感谢您的耐心等待。(点击关闭此消息)”

2

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

我不知道该解决方案是如何满足您的特定需求,但要记住,你可以使用JavaScript来启用或禁用按钮右侧之前发送的文件创建请求服务器(这样,在用户开始下载电子表格时,该按钮已处于您希望的状态)。

相关问题