Response.Redirectを実行する前にパネルを表示/非表示にする方法
-
03-07-2019 - |
質問
Response.Redirectを開始して、完了したらファイルをダウンロードするフォームがあります。また、リダイレクトを実行する前にフォームを非表示にして「ありがとう」パネルを表示したいのですが、asp.netエンジンは、次のコードで前の2つのタスクを実行せずにリダイレクトを行うようです:
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>
ページの表示が変更される前にこのリダイレクトが発生する場合があります。この場合、HTMLのbodyタグでこれを試してください(引用の種類に注意してください):
<body onload='location.href="http://otherServerName/fileToDownload";'>
すべてのポストバックは、現在のページの一部のプロパティを変更するだけでなく、実際に新しいページをクライアントに提供することを覚えておいてください(ASP.NETがまるでWindowsフォームのように見せかけようとしても)
個人的には、さまざまなビットを表示/非表示することで1ページですべてを実行するのではなく、プロセスの各ステージに個別のページを使用することを好みますが、時代遅れになる可能性があります。
編集: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を非表示にしてリダイレクトを実行するか、2つのポストバックを実行します。最初のポストバックはフォームを非表示にしてお礼を表示し、2番目はお礼が表示されたらリダイレクトを実行します画面。
または、ポストバックとフォームの非表示が完了した後、宛先を指すリダイレクトの代わりにjavascript window.openを実行できます。
リダイレクトヘッダーを手動で送信して、待機する秒数を使用する方法がありますか?
Response.AddHeader("Redirect", "3; URL=" + _downloadURL")
編集
もう一度質問を読んだ後、少し誤解したかもしれません。
「ありがとう」となるようにプロセス全体を遅らせたいようです。パネルを表示できます。それはあなたに2つの可能性を残します:
- パネルを表示し、フォームのPOSTを遅らせるにはJavaScriptを使用します。サーバーは、
Response.Redirect()
を使用してすぐにリダイレクトできます。これは、より現代的な方法です。 - または、JavaScriptから完全に独立したい。この場合、サーバーに中間的な「ありがとう、ここをクリックして続行」を表示する必要があります。フォームPOSTでページを開き、
Response.AddHeader()
を介してリダイレクトヘッダーメソッドを使用して、そのページを自動的に削除します。これは少し時代遅れですが、信頼性があります。
JavaScriptをオフにしているユーザーには一貫性がないため、両方を実際に組み合わせることはできません。
成功メッセージへのリンクを追加するだけでabrudtkuhによる提案を行うことになりました...また、javascriptリダイレクトを実装して自動的にダウンロードを開始しますが、javascriptのみに依存したくはなかったため、ページに表示されるボタン。
みんなのヒントに感謝します-みんなロック!
乾杯 集合