Как показать / скрыть панели перед выполнением Response.Redirect - PullRequest
4 голосов
/ 16 октября 2008

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

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

                if(success)
                    Response.Redirect(_downloadURL); 

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

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

Ответы [ 7 ]

2 голосов
/ 16 октября 2008

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

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

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

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

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

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

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

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

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

1 голос
/ 16 октября 2008

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

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

1 голос
/ 16 октября 2008

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

1 голос
/ 16 октября 2008

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

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

Response.AddHeader("Content-disposition", "attachment; filename=" & myUserFriendlyFileName)
Response.ContentType = "application/octet-stream"
Response.OutputStream.Write(buffer, 0, buffer.Length)
1 голос
/ 16 октября 2008

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

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

EDIT

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

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

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

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

0 голосов
/ 17 октября 2008

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

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

веселит Greg

0 голосов
/ 16 октября 2008
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);
                }
...