Как показать/скрыть панели перед выполнением Response.Redirect

StackOverflow https://stackoverflow.com/questions/208234

Вопрос

У меня есть форма, которая запускает Response.Redirect для загрузки файла после завершения.Я также хочу скрыть форму и показать панель «Спасибо» до того, как произойдет перенаправление, однако кажется, что движок asp.net просто выполняет перенаправление, не выполняя предыдущие две задачи в следующем коде:

if (success)
                {
                    lblSuccessMessage.Text = _successMessage;
                    showMessage(true);                        
                }
                else
                {
                    lblSuccessMessage.Text = _failureMessage;
                    showMessage(false);
                }

                if(success)
                    Response.Redirect(_downloadURL); 

Есть идеи, как заставить страницу обновиться до того, как сработает перенаправление??

Спасибо, Гипс Грег

Это было полезно?

Решение

if (success)
                {
                    lblSuccessMessage.Text = _successMessage;
                    showMessage(true);                        
                }
                else
                {
                    lblSuccessMessage.Text = _failureMessage;
                    showMessage(false);
                }

                if(success) {
                    Threading.Thread.Sleep(200)
                    Response.Redirect(_downloadURL);
                }

Вы можете заставить его подождать перед перенаправлением, переводя поток в спящий режим.

Лучший и наиболее удобный вариант — позволить пользователю продолжить работу самостоятельно, добавив кнопку.Например, вы можете сделать следующее:

if (success)
                {
                    lblSuccessMessage.Text = _successMessage + "<br /><INPUT TYPE='button' VALUE='Continue...' onClick='parent.location='" + _downloadURL + "'/>";
                    showMessage(true);                        
                }
                else
                {
                    lblSuccessMessage.Text = _failureMessage;
                    showMessage(false);
                }

Другие советы

Для перенаправления вам нужен код на стороне клиента.

Я бы предпочел встроить немного javascript для перенаправления.

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

<script>
    location.href = "http://otherServerName/fileToDownload";
</script>

Вы можете обнаружить, что это перенаправление происходит до того, как ваша страница изменила отображение — в этом случае попробуйте это в теге body вашего HTML (обратите внимание на различные типы кавычек):

<body onload='location.href="http://otherServerName/fileToDownload";'>

Помните, что каждое ответное сообщение фактически предоставляет клиенту новую страницу, а не просто изменяет некоторые свойства на текущей странице (даже если ASP.NET изо всех сил старается притвориться, что это похоже на форму Windows).

Лично я предпочитаю иметь отдельную страницу для каждого этапа процесса, а не пытаться сделать все на одной странице, показывая/скрывая различные фрагменты, — но я могу безнадежно устареть.

РЕДАКТИРОВАТЬ:если у них отключен JavaScript, вы можете просто предоставить ссылку для скачивания файла.

Вы не можете этого сделать, потому что это действие происходит на сервере до того, как оно будет отправлено обратно клиенту.Если вы пытаетесь отправить файл пользователю, вы можете передать его ему с помощью Response.Write().Это позволит им остаться на текущей странице, и вы сможете показать им сообщение, и они получат приглашение на загрузку.

буфер — это массив байтов файла

Response.AddHeader("Content-disposition", "attachment; filename=" & myUserFriendlyFileName)
Response.ContentType = "application/octet-stream"
Response.OutputStream.Write(buffer, 0, buffer.Length)

Непосредственно в asp.net вы не можете этого сделать, но можно либо использовать JS (как описано здесь), либо вы можете использовать IFrame, который загружает файл для загрузки - пользователь увидит спасибо, затем Открыть/сохранить диалог...

Скройте его на стороне клиента с помощью javascript, а затем выполните перенаправление или выполните две обратные передачи:первая обратная передача, чтобы скрыть форму и показать благодарность, а вторая — выполнить перенаправление после отображения благодарности на экране.

Или вы можете использовать javascript window.open вместо перенаправления, которое указывает на пункт назначения после завершения обратной передачи и сокрытия формы.

Может быть, вам подойдет отправка заголовка перенаправления вручную с ожиданием в течение нескольких секунд?

Response.AddHeader("Redirect", "3; URL=" + _downloadURL")

РЕДАКТИРОВАТЬ

Прочитав ваш вопрос еще раз, возможно, я вас немного неправильно понял.

Кажется, вы хотите отложить весь процесс, чтобы можно было отобразить панель «Спасибо».Это оставляет вам две возможности:

  • Либо вы полагаетесь на JavaScript для отображения панели и задержки формы POST.Затем сервер может немедленно перенаправить с помощью Response.Redirect().Это более современный способ сделать это.
  • Или вы хотите быть полностью независимым от JavaScript.В этом случае вы должны заставить сервер отображать промежуточную страницу «Спасибо, нажмите здесь, чтобы продолжить» в форме POST и использовать метод заголовка Redirect через Response.AddHeader() чтобы эта страница исчезла автоматически.Это немного старомодно, но надежно.

На самом деле вы не можете использовать комбинацию того и другого, потому что это будет противоречиво для тех пользователей, у которых отключен JavaScript.

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

Спасибо всем за советы – вы все молодцы!

Ура, Грег

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top