Internet Explorer (с настройками по умолчанию, которые, как я обычно предполагаю, будут действовать на рабочих столах Великого Немытых), похоже, не любит идею принятия содержимого вложения в ответ HTTP, если соответствующий запрос не был сделан непосредственно из действие пользователя (например, обработчик «щелчка» или отправка собственной формы). Возможно, есть больше деталей и нюансов, но это основное поведение, которое меня расстраивает.
Мне кажется, что это обычная ситуация: пользовательский интерфейс перед загружаемым контентом & mdash; скажем, подготовленный отчет в формате PDF & mdash; позволяет использовать некоторые параметры и входные данные при создании контента. Теперь, как и во всех формах, которые позволяют пользователю определять, как приложение что-то делает, возможно, что ввод будет ошибочным. Не всегда, но иногда.
Таким образом, возникает дилемма. Если клиент пытается сделать что-то необычное, например, выполнить транзакцию AJAX, чтобы позволить серверу проверить содержимое формы, а затем повторно отправить его для загрузки, IE это не понравится. Это не понравится, потому что фактическая HTTP-транзакция, которая возвращает вложение, будет происходить не в исходном обработчике пользовательского действия, а в обратном вызове завершения AJAX. Хуже того, поскольку панель безопасности IE, кажется, думает, что решение всех проблем состоит в том, чтобы просто перезагрузить внешнюю страницу с ее исходного URL-адреса, его приглашение пользователю продолжить загрузку подозрительного контента даже не будет работать.
Другой вариант - просто запустить форму. Сервер проверяет параметры, и, если что-то не так, он отвечает страницей контейнера формы, соответствующим образом пересылаемой сообщениями об ошибках. Если содержимое формы в порядке, оно генерирует содержимое и отправляет его обратно в ответ HTTP в виде вложенного файла. В этом случае (я думаю), IE доволен, потому что контент, по-видимому, был напрямую запрошен пользователем (что, кстати, является нелепо ненадежным способом отличить хороший контент от плохого). Это замечательно, но проблема в том, что клиентская среда (то есть код на моей странице) не может сказать, что загрузка работала, поэтому форма все еще находится там. Если моя форма находится в каком-то диалоговом окне, мне действительно нужно закрыть ее после завершения операции & mdash; на самом деле, это одна из причин, почему AJAX делает это.
Мне кажется, что единственное, что нужно сделать, это снабдить диалоги форм сообщениями, в которых говорится что-то вроде: «Закройте это, когда начнется загрузка». Это действительно кажется мне неубедительным, потому что это пример интерфейса «пожалуйста, нажмите эту кнопку для меня»: в идеале, мой собственный код должен иметь возможность нажимать кнопку, когда это необходимо. Ключевой момент, который я не знаю, это то, что клиентский код может обнаружить, что отправка формы привела к загрузке вложения. Я никогда не слышал о способе обнаружить это, но это сломало бы для меня тупик.