【问题标题】:asp.net linkbutton refresh page after download pdf下载pdf后asp.net链接按钮刷新页面
【发布时间】:2013-10-03 03:48:08
【问题描述】:

过程:

  1. 用户打开网页,其中包含一个asp:LinkButton(下载)和一个asp:Button(下一个)。
  2. “下一个”已禁用。
  3. 用户点击“下载”。 PDF 文件在内存中生成并作为下载发布。

需要: 启用“下一步”

问题:

  1. 无法使用 javascript 下载 - 必须是服务器端
  2. 不能影响网页上的元素使用服务器端没有 response.redirect
  3. 无法发出 response.redirect,因为 httpheaders 已经 作为第一步的一部分发布。

如果启用了“下一个”,我可以使用“下一个”转到新页面,但我希望在下载完成之前禁用它。

一些相关代码:

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        If SessionHelper.PrintedEnvelope Or SessionHelper.PrintedTemplate Then
            Me.btnNext.Enabled = True
            Me.btnNext.CssClass = "nextButton"
        Else
            Me.btnNext.Enabled = False
        End If
    End Sub

  Protected Sub btnEnvelopeTemplate_Click(sender As Object, e As EventArgs) Handles btnEnvelopeTemplate.Click
        Try
            SessionHelper.PrintedTemplate = True

            Dim m As System.IO.MemoryStream = DeliveryHelper.generateEnvelope(True, "English")
            Dim data As Byte() = m.ToArray


            Response.ClearContent()
            Response.ClearHeaders()
            Response.ContentType = "application/download"
            Response.AppendHeader("Content-Length", data.Length.ToString())
            Response.AppendHeader("Content-Disposition", "attachment; filename=" + "EnvelopeTemplate.pdf")
            Response.AppendHeader("Accept-Ranges", "bytes")
            Response.OutputStream.Write(data, 0, data.Length)
            If Response.IsClientConnected Then
                Response.Flush()
                ' Response.End()
            End If

        Catch ex As Exception
            'stuff here
        End Try


    End Sub

我也对 jquery 的想法持开放态度。

【问题讨论】:

  • 看看这是否有帮助stackoverflow.com/questions/1106377/…
  • 它看起来可以 - 但我也找到了一个简单的解决方法。如果我在浏览器中打开 pdf 而不是强制下载,当他们点击后退按钮返回屏幕时,它会自动刷新页面。对于纯网络屏幕阅读器来说更简单更好。但我会对此进行更多研究,以防万一。
  • 找到了更好的东西。看我的回答。

标签: jquery asp.net vb.net


【解决方案1】:

如果启用了“下一个”,我可以使用它转到新页面,但我希望在下载完成之前禁用它

对不起,这根本不可能。除非您编写自己的下载处理程序机制,否则无法监控下载进度并在完成时采取行动。浏览器不会将下载进度暴露给您页面上的脚本可以访问的任何内容。

【讨论】:

  • 也许我不清楚。我的意思是——一旦这个人点击了下载链接。即使有错误。但是 httpheaders 已经为下载而编写了,它不会再这样了。
【解决方案2】:

我找到了一个很好的解决问题的方法!

  1. 将 pdf 的内容放在页面上的隐藏 iframe 中。
  2. 在加载时禁用了下一步按钮。
  3. 点击链接按钮,我打开打印对话框并重新启用下一个按钮。

这是按钮

 <asp:Button  
      ID="btnNext" 
      runat="server" 
      Text="Next" 
      ClientIDmode = "Static" 
      CssClass="" 
      Enabled="false"
      PostBackURL="[nextpage]"/>

这里是链接

<asp:LinkButton id="btnEnvelope" ClientIDMode="Static" runat="server" Text="Print your envelope" ToolTip="Click to Open Print Dialog" />

<asp:LinkButton id="btnEnvelopeTemplate" ClientIDMode="Static" runat="server" Text="Print this template" ToolTip="Click to Open Print Dialog" />

这里是 iframe

<iframe id="frameEnvelope" class="pdfIframe" src="Documents/Envelope.aspx"></iframe>
<iframe id="frameEnvelopeTemplate" class="pdfIframe" src="Documents/EnvelopeTemplate.aspx"></iframe>

这是 Css

 .pdfIframe
 {
     display: none;
 }

这里是 javascript

function printFrame(id) {
         var frm = document.getElementById(id).contentWindow;
         frm.focus(); // focus on contentWindow is needed on some ie versions
         frm.print();
         document.getElementById('btnNext').disabled = false;
         return false;
     }

 $(document).ready(function () {
        //....other stuff

         $("#btnEnvelope").click(function () {
             printFrame("frameEnvelope");
         });

         $("#btnEnvelopeTemplate").click(function () {
             printFrame("frameEnvelopeTemplate");
         });
     });

【讨论】:

    猜你喜欢
    • 2011-02-13
    • 1970-01-01
    • 2018-09-30
    • 1970-01-01
    • 1970-01-01
    • 2014-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多