Jquery asp.net链接按钮下载pdf后刷新页面

Jquery asp.net链接按钮下载pdf后刷新页面,jquery,asp.net,vb.net,Jquery,Asp.net,Vb.net,过程: 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 = "n

过程:

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
  • 用户打开网页,其中包含一个
    asp:LinkButton
    (下载)和一个
    asp:Button
    (下一步)
  • “下一步”被禁用
  • 用户点击“下载”。PDF文件在内存中生成并作为下载文件发布
  • 需要: 启用“下一步”

    问题:

    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
    
  • 无法使用javascript下载-必须是服务器端
  • 使用服务器端时不能影响网页上的元素 response.redirect
  • 无法发出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的想法持开放态度

    如果启用了“下一步”,我可以使用“下一步”进入新页面,但我希望在下载完成之前将其禁用


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

    我找到了一个很好地解决问题的解决方案

  • 将pdf的内容放在页面上的隐藏iframe中
  • 已禁用加载上的“下一步”按钮
  • 单击linkbutton,我打开打印对话框并重新启用next按钮
  • 这是按钮

     <asp:Button  
          ID="btnNext" 
          runat="server" 
          Text="Next" 
          ClientIDmode = "Static" 
          CssClass="" 
          Enabled="false"
          PostBackURL="[nextpage]"/>
    
    这里是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");
             });
         });
    

    看看这是否有帮助,它看起来是可以的,但我也找到了一个简单的解决办法。如果我在浏览器中打开pdf而不是强制下载,当他们点击后退按钮返回屏幕时,它会自动刷新页面。对于纯网络屏幕阅读器来说更简单、更好。但我会进一步研究这一点,看看如何才能以防万一。找到更好的。看我的答案。也许我不清楚。我的意思是,一旦这个人点击了下载链接。即使有错误。但是HttpHeader是为下载而编写的,以后不会再下载了。
    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");
             });
         });