2011-02-07 18 views
6

W mojej aplikacji buduję plik zip, który użytkownik może pobrać w celu uzyskania informacji o wyeksportowanej bazie danych. Plik zip jest tworzony, gdy użytkownik kliknie przycisk "generuj dane" i loguję żądanie w bazie danych.Rozpocznij pobieranie pliku po odświeżeniu

Na mojej stronie mam widok Grid, który pokazuje historię pobierania Użytkownika, a także oferuje mu możliwość pobrania ostatnio wygenerowanego pliku przez określony czas.

Problem, który pojawia się po kliknięciu przycisku, chciałbym odświeżyć stronę (odświeżając widok siatki i pokazując ich najnowszą prośbę), a następnie rozpocząć pobieranie pliku dla nich (IE, wywołaj pytaj i pozwól im zdecydować, czy otworzyć/zapisać/anulować).

Jestem w stanie rozpocząć pobieranie z powrotem, ale mój widok Gridview nie aktualizuje się przed rozpoczęciem, więc nie pokazuje najnowszego żądania na liście. Jak mogę zaktualizować widok siatki PRZED rozpoczęciem pobierania?

Używam następujących czynności, aby rozpocząć pobieranie:

public void BeginDownload() 
    { 
     FileDownload download = InventoryService.GetLastThreeFileDownloads(this.EmployeeId).First(); 
     FileInfo fi = new FileInfo(Server.MapPath(SERVER_DOWNLOAD_PATH) + download.DownloadFileName); 

     Response.Clear(); 
     Response.ContentType = "application/zip"; 
     Response.AppendHeader("Content-Disposition", "attachment; filename=" + fi.Name); 
     Response.TransmitFile(fi.FullName); 
     Response.Flush(); 
    } 

Metoda jest wywoływana w przypadku Page_Load jako ostatniego elementu, jeśli ukryte pole jest ustawione na true (które ustawione po kliknięciu przycisk do zbudowania pliku).

Próbowałem również zrobić to poprzez wywołania jQuery/AJAX, aby odświeżyć stronę i rozpocząć pobieranie z niewielkim sukcesem. Myślałem o otwarciu modalnego okna dialogowego i umożliwieniu im kliknięcia łącza, aby rozpocząć pobieranie, a następnie odświeżenia strony po zamknięciu modalu, ale to ostatnia deska ratunku, jeśli nie mogę znaleźć innego rozwiązania.

Każda pomoc jest bardzo doceniana!

Odpowiedz

2

Chodzi o to, że nie odsyłasz strony do użytkownika .Klik użytkownik klika przycisk, który wysyła żądanie HTTP, dla którego generujesz odpowiedź HTTP zawierającą plik do pobrania. Jeśli chcesz odświeżyć stronę i dopiero potem wyślij mu plik do dowodu nloaded, musisz wysłać normalny wynik odesłania (nie wywołując metody BeginDownload), a następnie jakoś zmusić go do zrobienia innego żądania, na które odpowiesz z plikiem.

Istnieje tutaj są różne opcje:

  • obejmują meta refresh tag na stronie
  • użyć onload JavaScript
  • używać iframe
  • ... albo mieć użytkownikowi kliknięciu łącza, jak pan powiedział, .

Wszystkie metody mają swoje wady (należy uważać, zwłaszcza o „niechciany pobierania” ochrony IE, który w pewnych okolicznościach może być denerwujące), należy prawdopodobnie przynajmniej zawierać link do pobrania z „jeśli pobieranie nie uruchom automatycznie, kliknij tutaj. ")

+0

Zbudowałem link do pobierania do widoku siatki, więc jeśli nie rozpocznie się sam lub anuluje przez pomyłkę, nadal może pobrać plik, ponieważ jest przechowywany na serwerze. Dzięki za sugestie, na pewno je przejrzę i zobaczę, które działa najlepiej. – Delebrin

1

Wygląda na to, że próbujesz zrobić za dużo naraz. Sugeruję wysłanie z powrotem, aby zaktualizować gridview, a następnie za pomocą przekierowania do nowej, dedykowanej strony (lub programu obsługi ashx), aby pobrać plik. Strona gridview powinna pozostać widoczna, gdy używasz nagłówka treści na stronie pobierania/obsłudze ashx.

+0

Zgadzam się, prawdopodobnie robię za dużo naraz. Dzięki za sugestię, zobaczę, co mogę zrobić, a następnie wybierz rozwiązanie, które działa najlepiej! – Delebrin

3

Oto jak zrobiłem coś podobnego jakiś czas temu:

  1. Na odświeżenie strony (generowanie danych), odesłać zaktualizowaną stronę z najnowszych danych w GridView.
  2. Dodać niewielką funkcji javascript, które wykonuje, gdy strona zakończona załadunek i który żąda wygenerowany plik (coś jak window.location='fileurl';. Oczywiście tylko wysłać tę funkcję javascript na odświeżenie strony.

Zawartość wyświetlanej strony nie zmienić przy żądaniu pliku, po prostu wyskoczy okno dialogowe zapisywania w przeglądarce:

+0

Już wcześniej analizowałem podejście javascript z zegarem, ale nie próbowałem wysyłać funkcji bezpośrednio tylko wtedy, gdy jest to potrzebne. Sprawdzę tę opcję. Dzieki za sugestie! – Delebrin

Powiązane problemy