0

过程:

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

4

2 回答 2

0

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

  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");
         });
     });
于 2013-10-02T19:48:08.070 回答
0

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

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

于 2013-10-01T22:14:39.753 回答