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