Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien
Toon posts:

[ASP.Net] - Bestand creeren dmv ashx en progressbar

Pagina: 1
Acties:

Verwijderd

Topicstarter
Voor een website die ik bouw, moet op de achtergrond een PDF worden gegenereerd. Ik heb een HttpHandler gemaakt die de PDF genereert en dmv response.Write genereert en serveert. Werkt prima.
Op de site staat een linkje naar /CreatePdf.ashx, waar na +- 15 seconden de PDF gedownload wordt.

Ik wil echter een voortgangsindicator / melding tonen tijdens het genereren (jquery), die ook weer weg moet gaan als het bestand geserveerd is. Ik heb al van alles geprobeerd:
- jquery.blockUI in de onclick() van de link, maar die gaat niet weer weg. Ik weet niet waar ik de unblockUI moet zetten.
- Bij klikken op de link in code behind een iframe genereren. Levert IE-warnings op.

Nog veel meer gezocht en geprobeerd, maar dit moet volgens mij allemaal veel makkelijker kunnen. Kunnen jullie mij een duwtje in de goede richting geven?

  • Haan
  • Registratie: Februari 2004
  • Laatst online: 19:48

Haan

dotnetter

Een alternatief is misschien om een aspx pagina te gebruiken en daarop een UpdateProgress te zetten met een leuk animated gifje.

Kater? Eerst water, de rest komt later


Verwijderd

Topicstarter
Haan schreef op maandag 04 april 2011 @ 11:53:
Een alternatief is misschien om een aspx pagina te gebruiken en daarop een UpdateProgress te zetten met een leuk animated gifje.
Die gaat wel weer weg?
Het mag ivm regels klant niet afhankelijk zijn van javascript. Dus, daarom gebruik ik liever geen updatepanels...

/edit: het is gewoon een linkje naar een .ashx, dan werkt het op een updatepanel sowieso niet toch...? Het lastige hieraan is dat de file d.m.v. Response.Write wordt geserveerd en dat levert problemen op met UpdatePanels.

[ Voor 23% gewijzigd door Verwijderd op 04-04-2011 11:59 ]


  • Haan
  • Registratie: Februari 2004
  • Laatst online: 19:48

Haan

dotnetter

Het was maar een ideetje van mij, verder geen idee of en hoe dat zou werken. Maar je zegt nu dat je niet afhankelijk mag zijn van javascript, maar je bent wel met jQuery bezig :?

Kater? Eerst water, de rest komt later


Verwijderd

Topicstarter
Haan schreef op maandag 04 april 2011 @ 12:04:
Het was maar een ideetje van mij, verder geen idee of en hoe dat zou werken. Maar je zegt nu dat je niet afhankelijk mag zijn van javascript, maar je bent wel met jQuery bezig :?
Ja, de meldingen wil ik met jquery tonen, maar het downloaden zelf moet wel gewoon door een link naar de ASHX zijn.
Dus, bijv in de onclick de melding tonen, maar in de href een link naar de ashx. Zonder javascript werkt het dan wel en zie je alleen de meldingen niet.

Verwijderd

Topicstarter
Ik heb dus nu dit:

code:
1
<a href="/_layouts/CreatePdf.ashx" onclick="$.blockUI({ message: '<h1>PDF wordt gegenereerd</h1>' });">DOWNLOAD</a>

... maar die melding gaat dus niet meer weg nadat het download-schermpje weggeklikt wordt... Ik moet dus de event hebben wanneer deze synchrone operatie klaar is.

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Ik heb het onlangs zo opgelost (in pseudo code, ik ga niet alles weggeven :P )

Clientside JS:
JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
var tmr;

function downloadfile(url) {
  var t = hash(url); //Create a hash based on filename (a simple hash algo should suffice)
  clearcookie(t); //Make sure cookie isn't set
  tmr = setinterval(checkdownloadReady(t), 250); //Start checking cookie
  blockui();  //Disable UI
  window.location = url; //Downloadfile
}

function checkdownloadReady(token) {
  if (getcookie(token)) {
    clearinterval(tmr); //Stop polling
    enableui();  //Re-enable UI
    clearcookie(t); //Cleanup cookie
  }
}


Server-side:
code:
1
2
setcookie(hash(filename), 'Woei');  //Make sure hash returns exact same value as client-side JS would
output_file(filename);


Werkt in alle (recente) major browsers; IE6 heb ik niet getest. Zodra de "Save file" dialog door de browser wordt getoond wordt de UI gedeblokkeerd (of een fractie van een seconde later; afhankelijk van je poll interval).

[ Voor 15% gewijzigd door RobIII op 04-04-2011 12:35 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Verwijderd

Topicstarter
RobIII schreef op maandag 04 april 2011 @ 12:32:
Ik heb het onlangs zo opgelost (in pseudo code, ik ga niet alles weggeven :P )

Clientside JS:
JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
var tmr;

function downloadfile(url) {
  var t = hash(url); //Create a hash based on filename (a simple hash algo should suffice)
  clearcookie(t); //Make sure cookie isn't set
  tmr = setinterval(checkdownloadReady(t), 250); //Start checking cookie
  blockui();  //Disable UI
  window.location = url; //Downloadfile
}

function checkdownloadReady(token) {
  if (getcookie(token)) {
    clearinterval(tmr); //Stop polling
    enableui();  //Re-enable UI
    clearcookie(t); //Cleanup cookie
  }
}


Server-side:
code:
1
2
Set cookie based on hash
Serve/output file


Werkt in alle (recente) major browsers; IE6 heb ik niet getest. Zodra de "Save file" dialog door de browser wordt getoond wordt de UI gedeblokkeerd (of een fractie van een seconde later; afhankelijk van je poll interval).
Nice. Precies wat ik zocht. Ik zocht dus iets om in de filegeneratie iets vast te leggen dat de file gegenereerd is, maar kon geen javascript outputten (immers, output is nodig voor download).
Ik ga knutselen :)

Verwijderd

Topicstarter
Wauw. Briljant. Werkt als een trein.
Ik zag even de bomen niet meer zeg maar... Al zoveel geprobeerd, en dat alles voor een meldinkje tijdens het genereren van een bestand 8)7

Thanks, het werkt!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Wat had je anders verwacht? :P

Ik zit trouwens net te denken dat ik 't iets anders heb gedaan. Scheelt een globale var en 't clearen van een interval:

(Pseudo)
JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function downloadfile(url) {
  var t = hash(url); //Create a hash based on filename (a simple hash algo should suffice)
  clearcookie(t); //Make sure cookie isn't set
  settimeout(checkdownloadready(t), 250); //Start checking cookie
  blockui();  //Disable UI
  window.location = url; //Download file
}

function checkdownloadready(token) {
  if (getcookie(token)) {
    enableui();  //Re-enable UI
    clearcookie(t); //Cleanup cookie
  } else {
    settimeout(checkdownloadready(token), 250); //Check again, later
  }
}

(Uit m'n blote bol).

[ Voor 72% gewijzigd door RobIII op 04-04-2011 13:36 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij

Pagina: 1