【发布时间】:2020-04-09 18:45:01
【问题描述】:
我想从 ASP 网络表单页面下载文件。
如果我使用没有 MasterPage 的 WebForm,一切都很好,我有一个带有这个的 LinkButton
Private Sub linkDOWNLOAD_Click(sender As Object, e As EventArgs) Handles linkDOWNLOAD.Click
Dim filePath = "C:\files\" + DropDownList1.SelectedItem.Value
Dim fileStream As Stream = streamClient.someWebServiceReturningFileStream(filePath)
Dim buffer(65536) As Byte
Dim bytesRead = 0
Response.BufferOutput = False
HttpContext.Current.Response.Clear()
HttpContext.Current.Response.ClearHeaders()
HttpContext.Current.Response.ContentType = "application/octet-stream"
HttpContext.Current.Response.AddHeader("Content-Disposition",
"attachment; filename=" + DropDownList1.SelectedItem.Value)
bytesRead = fileStream.Read(buffer, 0, buffer.Length)
While (bytesRead > 0)
If (Response.IsClientConnected) Then
Response.OutputStream.Write(buffer, 0, bytesRead)
Response.Flush()
buffer = New Byte(65536) {}
bytesRead = fileStream.Read(buffer, 0, buffer.Length)
Else
bytesRead = -1
End If
End While
Response.Flush()
Response.Close()
Response.End()
End
正如我所说,这工作正常,浏览器打开对话框以下载文件,但如果我在 MasterPage 的内容页面内的按钮中尝试相同的代码,则什么也不会发生。
母版页有这个更新面板:
...
<asp:UpdatePanel ID="updatePanelBODY" runat="server">
<ContentTemplate>
<asp:ContentPlaceHolder ID="contentBODY" runat="server">
</asp:ContentPlaceHolder>
</ContentTemplate>
</asp:UpdatePanel>
...
还有内容页:
<asp:Content ID="Content2" ContentPlaceHolderID="contentBODY" runat="server">
<asp:LinkButton ID="linkDOWNLOAD" runat="server">Download File</asp:LinkButton>
</asp:Content>
我不知道如何解决这个问题,我发现的每个示例都是基于没有母版页的网络表单。
感谢您的帮助。
已解决:请看下面的答案。
【问题讨论】:
-
你的事件触发了吗?放置断点时会发生什么?
-
@mxmissile 是的,事件正在触发,它到达了 Response.End() 但没有到达最终的 End 就在那里完成,我怀疑这是这里的问题,但我不知道怎么办。
-
UpdatePanel使用 AJAX,我严重怀疑您是否可以像这样与Response对象交互以下载文件。查看 UpdatePanel 触发器,也许可以解决这些问题。 -
@mxmissile 这似乎是问题所在,但 UpdatePanel 触发器无法访问 ContenPlaceHolder 内的控件。您知道我可以查看任何代码或文章来执行此操作吗?
标签: asp.net