下载pdf后的asp.net linkbutton刷新页面

时间:2013-10-01 21:47:55

标签: jquery asp.net vb.net

流程:

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

    问题:

    1. 无法使用javascript下载 - 必须是服务器端
    2. 不能使用服务器端而不影响网页上的元素 的Response.Redirect
    3. 无法发出response.redirect,因为httpheaders已经存在 已作为第一步的一部分发布。
    4. 如果已启用,我可以使用“next”转到新页面,但我希望在下载完成之前禁用它。

      一些相关代码:

      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的想法持开放态度。

2 个答案:

答案 0 :(得分:0)

  

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

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

答案 1 :(得分:0)

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

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

     <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");
             });
         });