Как я могу остановить постбэк от обновления страницы на клиенте

Когда я запускаю обратную передачу с помощью __doPostBack, создается файл, который возвращается пользователю для загрузки в папку HttpContext.Current.Response.

Поскольку я меняю Response, страница, включая значения javascript, не изменяется.

Но когда у меня нет файла для вывода, страница обновляется (из-за обратной передачи), и модификация javascript на странице теряется.

Как я могу «остановить» обратную передачу и сохранить мою текущую страницу? Я не могу использовать асинхронную обратную передачу, потому что мне нужна обратная передача, чтобы пользователь мог загрузить файл.

EDIT: дополнительная информация после некоторых вопросов в комментариях:

  • Файл запрашивается в запросе веб-сервиса. Веб-сервис должен выполнить тяжелый запрос, чтобы определить, будет ли создан файл. Я предпочитаю, чтобы это происходило только один раз.
  • Пользователь может перетаскивать некоторые фильтры, которые будут использоваться в запросе файла. Если файл недоступен, пользователь должен иметь возможность изменить свои фильтры, поэтому страницу не следует изменять.

person Erik Dekker    schedule 05.01.2012    source источник
comment
Первое, что приходит мне в голову (не проверено): использовать скрытую кнопку как PostbackTrigger для вашей панели обновлений. В вашем обработчике на стороне сервера, где вы создали файл (или нет), зарегистрируйте javascript, который clicks эта кнопка, если у вас есть файл. Обработайте это событие и доставьте файл. Если файла нет, не регистрируйте скрипт.   -  person Tim Schmelter    schedule 05.01.2012
comment
Это будет работать, но моя проблема в том, что файл запрашивается из веб-сервиса. Я не знаю, будет ли у меня файл, пока запрос не будет выполнен. С вашим решением файл будет создан дважды. Это сложный запрос, который может занять некоторое время, поэтому я бы не стал делать это дважды.   -  person Erik Dekker    schedule 05.01.2012
comment
Почему вам нужно создать файл, чтобы узнать, существует ли он? Это звучит довольно странно. Я бы добавил в ваш веб-сервис метод, который проверяет это без создания.   -  person Tim Schmelter    schedule 05.01.2012
comment
Файл создается в запросе веб-сервиса в зависимости от указанных параметров. Это не существующий файл, который выскочил. Запрос на получение данных для создания файла является тяжелым, и только после того, как этот запрос будет выполнен, я знаю, будет ли создан файл или нет.   -  person Erik Dekker    schedule 05.01.2012
comment
Может быть, я наивен, но разве не параметры решают, будет файл создан или нет? Если это так, веб-служба также должна иметь возможность возвращать boolean, если файл может быть создан с заданными параметрами без фактического создания файла. Последнюю функцию следует вызывать только из полной PostbackTrigger обратной передачи.   -  person Tim Schmelter    schedule 05.01.2012
comment
Параметры используются для выполнения запроса. Этот запрос возвращает данные или нет, и эти данные используются для создания файла. Вы правы, я могу добавить логическую функцию, которая возвращает ЕСЛИ файл может быть создан, но запрос все равно будет выполняться дважды, один раз для определения ЕСЛИ... и другой раз для создания файла. Я действительно не хочу, чтобы этот тяжелый запрос выполнялся дважды.   -  person Erik Dekker    schedule 05.01.2012
comment
Возможно, вам стоит подойти к своей цели с другой стороны. Вместо того, чтобы пытаться сделать это с обратной передачей на ту же страницу, как насчет того, чтобы поместить iframe на страницу и настроить кнопку для URL-адреса iframe на страницу, которая загрузит файл. В основном разделите процесс загрузки файла на его собственную страницу и используйте параметры строки запроса для любой информации, которая должна быть передана ему.   -  person patmortech    schedule 05.01.2012


Ответы (1)


Из стандартов W3 и RFC 2616:

10.2.5 204 Нет содержимого Сервер выполнил запрос, но ему не нужно возвращать тело объекта, и он может захотеть вернуть обновленную метаинформацию. Ответ МОЖЕТ включать новую или обновленную метаинформацию в виде заголовков сущностей, которые, если они присутствуют, ДОЛЖНЫ быть связаны с запрошенным вариантом.
Если клиент является пользовательским агентом, ему НЕ СЛЕДУЕТ изменять представление документа с этого который вызвал отправку запроса. Этот ответ в первую очередь предназначен для того, чтобы разрешить ввод для выполнения действий, не вызывая изменения в активном представлении документа пользовательского агента, хотя любая новая или обновленная метаинформация СЛЕДУЕТ применять к текущему документу. в активном представлении пользовательского агента. Ответ 204 НЕ ДОЛЖЕН включать тело сообщения и, таким образом, всегда заканчивается первой пустой строкой после полей заголовка.

Обратите внимание на жирную линию здесь. Я сам не пробовал; однако установка статуса HTTP на 204 и отправка обратно пустого документа, а не попытка полностью остановить обратную передачу, определенно стоит того.

Удачи, я надеюсь, что это поможет.

РЕДАКТИРОВАТЬ: это код, который делает свое дело:
System.Web.HttpContext.Current.Response.StatusCode = 204;

person JamieSee    schedule 07.01.2012
comment
Удивительно.. отлично работает! Точно ответ на мой вопрос без каких-либо обходных путей - person Erik Dekker; 09.01.2012