2010-12-29 3 views
8

У меня есть IFRAME на моей странице, и внутри этого фрейма я код выполнить:

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

Отклик возвращается в порядке, но я не получаю диалог «SAVE Attachment», ничего не происходит ... Чтобы все было ясно, заголовки в порядке (размещение контента, тип mime и т. д.), так как при выполнении этого экспорта с использованием простой формы он работает. Похоже, что это имеет какое-то отношение к призыву ajax. Будет ли это работать?

Благодаря

ответ

8

Вы не получите какдиалоговое при использовании AJAX. Если вы хотите, чтобы этот диалог просто обеспечить нормальную ссылку на файл загрузки:

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

или если вам нужен запрос POST:

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

При использовании AJAX для загрузки файла содержимое этот файл извлекается при успешном обратном вызове, но вы не можете с ним справиться: вы не можете сохранить его на клиентском компьютере, и вы не можете получить диалог «Сохранить как».

9

Чтобы продлить ответ Дарин, вот как я это сделал:

У меня есть скрытые формы, со скрытым элементом ввода, которые будут использоваться для динамического хранения значений I хотите конвертировать/экспорт:

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

Затем у меня есть этот код jQuery для динамического заполнения элементов параметрами сообщения, а затем отправьте форму.

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

И поскольку возвращаемый ответ (сюда вызов API) имеет Content набора заголовка Disposition, эта форма представить действие обыкновения перемещаться пользователем от текущей страницы (но только возвращает вложение) как нормальная форма представить , и, тем самым, сохраняет иллюзию типичного Ajax submit :-)

+0

nemesisfixx - спасибо за этот отличный ответ. Быстрый вопрос ... Есть ли способ, чтобы исходная страница узнала, когда приложение было загружено? Например - я бы хотел, чтобы пользователь не нажал кнопку загрузки несколько раз, поэтому я отключу его сразу после ее щелчка. Однако, как только загрузка будет завершена, я хочу снова включить ее (чтобы она могла запросить другую загрузку с новыми настройками/входами). Это можно сделать? – mattstuehler

+0

@mattstuehler, я не уверен в прямолинейном подходе, но, возможно, вы могли бы запустить вызов на стороне сервера fron-end (подумайте о протоколах Comet), что позволит вашему приложению узнать, когда загрузка была завершена на стороне сервера , Другой «более простой» подход может состоять в том, чтобы просто ждать определенного временного окна, после истечения которого вы просто предположите, что загрузка должна быть завершена, и u может отображать кнопку (может помочь некоторая предварительная информация о среднем размере файла yo) , – nemesisfixx