2013-10-01 2 views
0

процесса:asp.net обновления страницы LinkButton после загрузки PDF

  1. Пользователь открывает веб-страницу, которая содержит asp:LinkButton (скачать) и asp:Button (следующий).
  2. «следующий» отключен.
  3. Пользователь нажимает кнопку "скачать". PDF-файл создается в памяти и выдается как загрузка.

Потребность: включить "рядом"

Проблема:

  1. не может загрузить с помощью Javascript - должен быть на стороне сервера
  2. не могут повлиять на элементы веб-страница с использованием серверной стороны без response.redirect
  3. не может выдать response.redirect, потому что httpheaders уже были выпущены как часть первого шага.

Я могу перейти на новую страницу, используя «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 идеи тоже.

+0

Посмотри, если это помогает http://stackoverflow.com/questions/1106377/detect-when- browser-receive-file-download –

+0

похоже, что это возможно, но я также нашел легкую обходную работу. Если я открою PDF в браузере вместо того, чтобы форсировать загрузку, когда они нажимают кнопку «Назад», чтобы вернуться на экран, она автоматически обновляет страницу. Проще и лучше для веб-экранов. Но я рассмотрю это еще раз, чтобы посмотреть, как это будет работать на всякий случай. – user158017

+0

нашел что-то лучшее. см. мой ответ. – user158017

ответ

0

Я мог бы перейти на новую страницу с помощью «следующий», если она включена, но я хочу его выключенным, пока загрузка не будет сделано

Я сожалею, что это просто невозможно. Невозможно отслеживать ход загрузки и принимать меры, когда оно будет завершено, если вы не напишете собственный механизм обработчика загрузки. Браузеры не раскрывают ход загрузки на все, к чему может обратиться скрипт на вашей странице.

+0

Возможно, я был неясен. Я действительно имею в виду - как только человек щелкнул ссылку для загрузки. Даже если есть ошибка. Но httpheaders были написаны для загрузки, и это не повторится. – user158017

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 id="frameEnvelope" class="pdfIframe" src="Documents/Envelope.aspx"></iframe> 
<iframe id="frameEnvelopeTemplate" class="pdfIframe" src="Documents/EnvelopeTemplate.aspx"></iframe> 

Вот устанавливаемому сотовый

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

Очень приятно, поздравляю –

Смежные вопросы