Как: отправить jQuery в файл ashx, чтобы принудительно загрузить результат?

У меня есть обработчик ashx, который берет свойство html из запроса, а затем возвращает его тому, кто его вызвал. У меня также есть Content-Disposition, установленный как вложение.

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

Я застрял на следующем: мне нужно сделать это из javascript (jQuery). Я буду публиковать содержимое div и выполнять дальнейшую обработку.

Может ли кто-нибудь дать мне несколько советов о том, как это делается?

Большое спасибо.


person Paul    schedule 24.06.2010    source источник


Ответы (1)


Я бы (на самом деле, сделал :-)) иметь форму со скрытым полем, скопировать содержимое div в поле, а затем отправить форму в скрытый (display: none) iframe.

Включение скрытого iframe на странице:

<iframe name="formTarget" src="blank.html" style="display: none">

(Например, изначально он пустой. На самом деле я буквально использую файл blank.html, который именно так и звучит, вместо (скажем) about:blank, потому что последний в некоторых случаях работает не совсем правильно; я не помню деталей.)

Указание форме отправить в iframe и запустить ваш файл ashx:

<form ... action="your.ashx" target="formTarget" ... >

Копируем содержимое div в поле:

$("#fieldId").val($("#divId").html()); // Either .html() or .text(), depending on what you want

Отправка формы:

$("#formId").submit();

(Заполните различные «...» соответствующим образом.)

В моем случае я показываю оверлейный элемент div, сообщающий пользователю, что я делаю, и запускаю таймер, который отслеживает содержимое iframe (сообщения об ошибках) и cookie-файл состояния (см. этот ответ для получения дополнительной информации об уловке cookie) . Наложение обновляется или удаляется в зависимости от результата.

person T.J. Crowder    schedule 24.06.2010
comment
Где целью iframe является страница, которая затем вызовет ashx? В противном случае обработчик запускается сразу после рендеринга iframe. - person Paul; 24.06.2010
comment
Спасибо за сообщение, однако я все еще не уверен, как это реализовать? - person Paul; 24.06.2010
comment
@Paul: Нет, ashx будет действием формы. Для начального src iframe я обычно использую пустой.html, который звучит именно так (потому что about:blank не совсем работает в некоторых браузерах). Таким образом, вы начинаете со скрытого iframe (фактически) пустого, а затем отправляете данные в файл ashx, нацеленный на этот фрейм, который затем должен инициировать загрузку. - person T.J. Crowder; 24.06.2010
comment
У меня не работает.. html: ‹iframe name=formTarget src=blank.html style=display: none/› ‹form target=formTarget action=Excel.ashx id=formToGetExcel› ‹input type=hidden id= hiddenHtml /› ‹/form› jQuery: var str = $(‹table›‹tr›‹td›один один‹/td›‹td›один два‹/td›‹/tr›‹tr›‹td›два один ‹/td›‹td›two two‹/td›‹/tr›‹/table›); $(#hiddenHtml).val($(str).html()); $(#formToGetExcel).submit(); Вообще ничего не происходит. Любые дальнейшие идеи? Спасибо - person Paul; 24.06.2010
comment
@Paul: я бы прошел через это с помощью отладчика, чтобы выяснить, на каком этапе он терпит неудачу. (Примечание — и это не должно быть проблемой — но $("#hiddenHtml").val( $(str).html() ); вызывает $ для чего-то [str], которое уже является объектом jQuery.) Правильно ли он устанавливает скрытое значение? Он отправляет форму? И Т. Д. - person T.J. Crowder; 24.06.2010
comment
Использование отправки ввода в форме отправляет сообщение самому себе. Это страница aspx, поэтому на ней уже есть основная форма. Еще одна причина, по которой я бы предпочел использовать MVC, а не обычные веб-формы... Возможно, в этом проблема. Есть ли метод для решения этой проблемы? Большое спасибо за помощь. - person Paul; 24.06.2010
comment
@Paul: Использование ввода отправки в форме отправляет обратно самому себе. Форма отправляется в место, указанное атрибутом action элемента form, и результаты отображаются в окне, названном target атрибут элемента form (то же окно, в котором используется форма, если нет атрибута target, и создается новое окно, если ни одно из них не соответствует заданному имени). Я не уверен, что понимаю, что вы имеете в виду, когда говорите, что оно подчиняется самому себе. - person T.J. Crowder; 25.06.2010
comment
Я работал над этим, имея форму в файле Blank.html и используя набор jQuery, чтобы установить значение и отправить форму. Большое спасибо за вашу помощь в этом. - person Paul; 25.06.2010
comment
@Paul: Я рад, что у вас это работает, но вам действительно не нужно этого делать. Мне не нужно в моем основном приложении, которое делает это, с очень похожей настройкой (aspx вместо ashx и Prototype, а не jQuery, но я не думаю, что это имеет значение). В. странно. - person T.J. Crowder; 25.06.2010