gpt4 book ai didi

asp.net - 仅在 Page_Load 中使用 ASPX 页面上的响应下载 PDF

转载 作者:可可西里 更新时间:2023-11-01 16:40:40 28 4
gpt4 key购买 nike

我已经看到几个与使用 Response 从 Web 浏览器下载 PDF 相关的问题,但似乎没有一个符合我遇到的神秘问题。

我正在开展一个项目,该项目要求用户能够单击一个按钮 (btnPDF) 以立即将具有特定“ID”字符串的 Telerik 报告的 PDF 下载到“下载”文件夹。此进程最初位于 IIS 上的 ASPX 页面中,与按钮所在的位置分开。单击 btnPDF 时,我使用 Response.Redirect 通过该页面下载 PDF。下载 PDF 的代码如下所示:

Response.Clear()
Response.ContentType = result.MimeType 'this is always "application/pdf"
Response.Cache.SetCacheability(HttpCacheability.Private)
Response.Expires = -1
Response.Buffer = True
Response.AddHeader("Content-Disposition", String.Format("{0};FileName={1}", "attachment", fileName))
Response.BinaryWrite(result.DocumentBytes)
Response.End()

请注意,result.DocumentBytes 是一个包含 PDF 正确字节的字节数组。

此代码运行良好。现在,我需要将流程合并到 btnPDF 所在的同一页面,而不是将流程放在单独项目的单独页面上,这样当您单击btnPDF,调用一个执行相同任务的子程序。我认为这会很容易,几乎就是复制和粘贴。在新的子例程中添加相同的代码,这就是我的点击事件处理程序“ButtonPDF_Click”现在的样子:

Protected Sub ButtonPDF_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnPDF.Click

DownloadReportPDF(Me.RadGrid1.SelectedValue.ToString())

Dim strMessage As String = "alert('Printed PDF Sheet.');"
ScriptManager.RegisterStartupScript(Me, Me.GetType, "MyScript", strMessage, True)

End Sub

Protected Sub DownloadReportPDF(ByVal releaseMasterId As String)
'Service call to generate report source
Dim service As New TelerikReportLibrary.ReportServices.PPSReportService
Dim source As Telerik.Reporting.TypeReportSource = service.GetReportSource(releaseMasterId)

'Render PDF and download
Dim reportProcessor As New ReportProcessor()
Dim result As RenderingResult = reportProcessor.RenderReport("PDF", source, Nothing)

Dim fileName As String = result.DocumentName + "_" + releaseMasterId + "." + result.Extension

Response.Clear()
Response.ContentType = result.MimeType 'this is always "application/pdf"
Response.Cache.SetCacheability(HttpCacheability.Private)
Response.Expires = -1
Response.Buffer = True
Response.AddHeader("Content-Disposition", String.Format("{0};FileName={1}", "attachment", fileName))
Response.BinaryWrite(result.DocumentBytes)
Response.End()

End Sub

但 PDF 不再下载。仍会创建准确的字节数组,但响应部分不会导致从浏览器下载 PDF。我发现在同一页面的 Page_Load 处理程序中调用 DownloadReportPDF 可以像以前一样成功生成和下载 PDF。

我看不出这不起作用的任何原因,但我是 ASP 的新手,而且我不太擅长 VB。我尝试过使用 Response.OutputStream、Response.WriteFile 和使用 MemoryStream,以及其他一些我已经忘记的事情。我希望有一些简单的东西,也许我可能会丢失 Page 或 btnPDF 的某种属性。以下是 btnPDF 的标记,以防万一:

    <asp:linkButton ID="btnPDF" CssClass="btn btn-default" runat="server" Width="115px">
<i class="fa fa-file-text" title="Edit"></i> PDF
</asp:linkButton>

什么可能导致这样的问题?我应该从哪里看这一点?

如果需要更多信息,请告诉我。

谢谢,谢恩

编辑:

我尝试在 btnPDF_Click 上设置 session 变量,并在回发时处理 PDF 下载。同样,生成了一个有效的字节数组,但 HttpResponse 没有导致从浏览器下载 PDF。

编辑:

基于上次编辑,这告诉我从 Page_Load 调用 DownloadReportPDF 仅在 IsPostBack 为 false 时有效。我刚刚测试了这个想法,它是正确的。在上面的代码中,如果我在尝试下载 PDF 时检查 IsPostBack,则为 true。进一步调查。

最佳答案

好吧,我终于找到了一个令我满意的解决方案(尽管我仍然不明白为什么在 IsPostBack 为 true 的情况下我无法使用 Response 下载 PDF)。

灵感来自 this thread ,我将之前发布的代码放在一个名为 PDFDownloadHandler 的 HttpHandler 中,然后在 btnPDF_Click 事件处理程序中使用 Response.Redirect 来利用 PDFDownloadHandler。 This article在这个过程中帮了我很多,因为这是我以前从未做过的事情。

如果其他人遇到这个问题,这里是新的 PDFDownloadHandler:

Imports Microsoft.VisualBasic
Imports System.Web
Imports Telerik.Reporting
Imports Telerik.Reporting.Processing

Public Class PDFDownloadHandler
Implements IHttpHandler

Public Sub ProcessRequest(ByVal context As _
System.Web.HttpContext) Implements _
System.Web.IHttpHandler.ProcessRequest
Dim request As HttpRequest = context.Request
Dim response As HttpResponse = context.Response

Dim path As String = request.Path
If path.Contains("pps.pdfdownload") Then
Dim releaseMasterId As String = request.QueryString("ID")
If releaseMasterId IsNot Nothing Then
'Service call to generate report source
Dim service As New TelerikReportLibrary.ReportServices.PPSReportService
Dim source As Telerik.Reporting.TypeReportSource = service.GetReportSource(releaseMasterId)

'Render PDF and save
Dim reportProcessor As New ReportProcessor()
Dim result As RenderingResult = reportProcessor.RenderReport("PDF", source, Nothing)

Dim fileName As String = result.DocumentName + "_" + releaseMasterId + "." + result.Extension

response.Clear()
response.ContentType = result.MimeType
response.Cache.SetCacheability(HttpCacheability.Private)
response.Expires = -1
response.Buffer = True
response.AddHeader("Content-Disposition", String.Format("{0};FileName={1}", "attachment", fileName))
response.BinaryWrite(result.DocumentBytes)
End If
End If

response.End()
End Sub

Public ReadOnly Property IsReusable() As Boolean _
Implements System.Web.IHttpHandler.IsReusable
Get
Return False
End Get
End Property
End Class

非常感谢任何关于为什么原始技术不起作用的进一步见解。

关于asp.net - 仅在 Page_Load 中使用 ASPX 页面上的响应下载 PDF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42511465/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com