2010-12-29 19 views
8

Mam iframe na mojej stronie, a wewnątrz tego iframe I wykonanie kodu:

$.ajax({ 
    url: '/SamplePage/ExportToExcel', 
    async: false, 
    data: par, 
    type: 'POST' 
}); 

Response jest zwracana w porządku, jednak nie pojawia się okno dialogowe „Zapisz załącznik”, nic się nie dzieje ... Aby wszystko było jasne, nagłówki są w porządku (rozmieszczenie zawartości, typ mime itp.), ponieważ kiedy wykonuję eksport, używając zwykłego formularza, działa. Wygląda na to, że ma coś wspólnego z wywołaniem ajax. Czy to jakoś zadziała?

Dzięki

Odpowiedz

8

Nie dostaniesz oknie dialogowym Zapisz jako, gdy za pomocą AJAX. Jeśli chcesz dostać to okno po prostu zapewnić prawidłowy link do pobrania pliku:

<a href="/SamplePage/ExportToExcel">download</a> 

lub jeśli trzeba żądania POST:

<form action="/SamplePage/ExportToExcel" method="post"> 
    <input type="submit" value="download" /> 
</form> 

Podczas korzystania AJAX Aby pobrać plik zawartość ten plik jest pobierany podczas oddzwaniania powodzenia, ale niewiele można z nim zrobić: nie można go zapisać na komputerze klienckim i nie można uzyskać okna dialogowego Zapisz jako.

9

Aby przedłużyć odpowiedź Darin, oto jak to zrobiłem:

Mam ukrytą formę, z ukrytym elementem wejściowym być stosowany do dynamicznego utrzymywania wartości pragnę konwersji/eksport:

<form id="svg_export_form" method="POST" style="display:none;visibility:hidden"> 
    <input type="hidden" name="svg" /> 
</form> 

Następnie mam ten kod jQuery, aby dynamicznie zapełnić elementy parametrami po, a następnie wysłać formularz.

$('#svg_export_form > input[name=svg]').val(svg_code); 
$('#svg_export_form').attr('action','api/reports/convert/svg/to/png'); 
$('#svg_export_form').submit(); 

A ponieważ wrócił odpowiedź (fro wywołania API) ma zawartość zestawu Disposition, ta forma przedstawienia działań przyzwyczajenie nawigacja użytkownika od bieżącej strony (ale tylko zwraca załącznik) jak zwykła forma przedstawienia , a więc nadal utrzymuje iluzję typowego Ajaxa :-)

+0

nemesisfixx - dziękuję za tę wspaniałą odpowiedź. Szybkie pytanie ... Czy istnieje sposób, aby strona oryginalna wiedziała, kiedy załącznik został pobrany? Na przykład - chciałbym uniemożliwić użytkownikowi klikanie przycisku pobierania więcej niż jeden raz, więc wyłączam go zaraz po kliknięciu. Jednak po zakończeniu pobierania chciałbym go ponownie włączyć (aby mogła poprosić o kolejne pobranie z nowymi ustawieniami/danymi wejściowymi). Czy można to zrobić? – mattstuehler

+0

@mattstuehler, nie jestem pewien prostoliniowego podejścia, ale prawdopodobnie mógłbyś wystrzelić wywołanie po stronie serwera do fron-end (pomyśl o protokołach Comet), który powiadomiłby Twoją aplikację, gdy pobieranie zostało ukończone po stronie serwera . Innym "łatwiejszym" podejściem może być po prostu czekanie na określone okno czasowe, po wygaśnięciu którego, po prostu zakładamy, że pobieranie musi być zakończone, a następnie można wyświetlić przycisk (pomocne mogą być wcześniejsze informacje o średnim rozmiarze pliku yo) . – nemesisfixx

Powiązane problemy