- PR -

【ASP.NET】ダウンロード後の画面リフレッシュの方法

1
投稿者投稿内容
ひろれい
ぬし
会議室デビュー日: 2006/03/02
投稿数: 486
お住まい・勤務地: 万博開催地
投稿日時: 2006-04-28 10:03
ASP.NET(VB.NET)で開発しております。

現在、ある画面で日付を入力させ、画面上に配置してある実行ボタンを押したタイミングで日付を元にサーバ側で対象データを抽出・ファイルを作成し、そのファイルをクライアント側にダウンロードさせています。

実行ボタンを押した際に、サーバ側で日付チェックを行なっており、指定できない日付の場合に、画面上のメッセージ出力用ラベルにエラーメッセージを出力しています。

画面にエラーメッセージが表示されている状態で、正しい日付を入力して実行ボタンを押すと、エラーメッセージが表示された状態で処理が正常に進んでいくので違和感があります。よって、何かのタイミングでエラーメッセージを消したいと思うのですが、うまくいかなくて悩んでいます。何か回避手段はあるのでしょうか?
メッセージを消すタイミングは、ダウンロード前でも後でも構わないのですが。

ちなみに、実行ボタンが押されたイベントで以下のような感じでダウンロードさせているため、サーバに制御が戻ってこないのではないか、と考えています。

コード:
Response.Clear()
Response.ContentType = "application/x-zip"
Response.Charset = ""
Response.AddHeader("content-disposition", "attachment; filename=" + HttpUtility.UrlEncode("報告書_") + ls_TaisyoYmd + "_Test.lzh")
Response.WriteFile(Server.MapPath("lzh/" & ls_LzhFile & ".lzh"))
Response.End()


よろしくお願い致します。
かるあ
ぬし
会議室デビュー日: 2003/11/16
投稿数: 1190
お住まい・勤務地: センガワ→ムサシノ
投稿日時: 2006-04-28 10:17
引用:

ちなみに、実行ボタンが押されたイベントで以下のような感じでダウンロードさせているため、サーバに制御が戻ってこないのではないか、と考えています。


そうですね、この場合だとLZHがダウンロードされるまでページの描画が行われません。

実行ボタンをクリックしたタイミングで表示しているテキストを
javascript でクリアor非表示にしてあげる。
っていうのはどうでしょうか
ひろれい
ぬし
会議室デビュー日: 2006/03/02
投稿数: 486
お住まい・勤務地: 万博開催地
投稿日時: 2006-04-28 10:33
引用:

かるあさんの書き込み (2006-04-28 10:17) より:

そうですね、この場合だとLZHがダウンロードされるまでページの描画が行われません。

実行ボタンをクリックしたタイミングで表示しているテキストを
javascript でクリアor非表示にしてあげる。
っていうのはどうでしょうか


かるあさん、お返事ありがとうございます。

ダウンロードされた後だと、ページの描画が行なわれるのですか?
一応、Page_Load にラベルをクリアする処理を入れたのですがクリアされなかったため、Response.End 後はサーバに処理が戻らないのかな、と。

かるあさんのおっしゃる通り、サーバ側で JavaScript を組み込んでおくのが良い方法かもしれませんね。
ぼのぼの
ぬし
会議室デビュー日: 2004/09/16
投稿数: 544
投稿日時: 2006-04-28 12:03
引用:

ひろれいさんの書き込み (2006-04-28 10:33) より:
ダウンロードされた後だと、ページの描画が行なわれるのですか?
一応、Page_Load にラベルをクリアする処理を入れたのですがクリアされなかったため、Response.End 後はサーバに処理が戻らないのかな、と。


サーバに処理が戻らない、というより、クライアントに処理が戻らない、と言った方が正確かも。
ひろれいさんの予想通り、Responseの内容がHTMLではないファイルになりますので、HTMLの再描画は行われません。

なので、かるあさんの案は、サーバ側でなくクライアント側で、PostBack前に画面再描画をクライアントスクリプトでやってしまったら?ということだと思います。

逆に、普通に画面再描画をやってしまって、ダウンロードの方をスクリプトでやってしまう、という方法もあります。

コード:
'実行ボタンのイベントハンドラ
Me.lblErrorMessage.Text = ""
Session("DownloadFileName") = ダウンロードするファイルのファイル名
Session("DownloadFilePath") = ダウンロードするファイルのフルパス
Dim s As String = "<script language='javascript'>location.href='Download.aspx';</script>"
RegisterStartupScript("DownloadScript", s)

'Download.aspxのPage_Load
Response.Clear()
Response.ContentType = "application/x-zip"
Response.Charset = ""
Response.AddHeader("content-disposition", "attachment; filename=" + _
    HttpUtility.UrlEncode(CStr(Session("DownloadFileName"))))
Response.WriteFile(CStr(Session("DownloadFilePath")))
Response.End()

かるあ
ぬし
会議室デビュー日: 2003/11/16
投稿数: 1190
お住まい・勤務地: センガワ→ムサシノ
投稿日時: 2006-04-28 12:47
引用:

ひろれいさんの書き込み (2006-04-28 10:33) より:

Response.End 後はサーバに処理が戻らないのかな


書き方が悪かったですね、ひろれいさんの言うとおり、
これ以降はクライアントにHTMLは送られません。

ぼのぼのさんのおっしゃっている通り
PostBack前に画面再描画をクライアントスクリプトでやってしまったら?
ということです。

引用:

ぼのぼのさんの書き込み (2006-04-28 12:03) より:

逆に、普通に画面再描画をやってしまって、ダウンロードの方をスクリプトでやってしまう、という方法もあります。


なるほど!!こういう手もあったんですね
さっさと返して表示だけしたら、もう1回取りにこさせるのか

ひろれい
ぬし
会議室デビュー日: 2006/03/02
投稿数: 486
お住まい・勤務地: 万博開催地
投稿日時: 2006-04-28 13:51
かるあさん、ぼのぼのさん、お返事ありがとうございます。

引用:

かるあさんの書き込み (2006-04-28 12:47) より:

書き方が悪かったですね、ひろれいさんの言うとおり、
これ以降はクライアントにHTMLは送られません。


要は、ボタンがクリックされたイベントでは何をやっても画面には反映されない、ということですね。

引用:

ぼのぼのさんのおっしゃっている通り
PostBack前に画面再描画をクライアントスクリプトでやってしまったら?
ということです。

引用:

ぼのぼのさんの書き込み (2006-04-28 12:03) より:

逆に、普通に画面再描画をやってしまって、ダウンロードの方をスクリプトでやってしまう、という方法もあります。


なるほど!!こういう手もあったんですね
さっさと返して表示だけしたら、もう1回取りにこさせるのか


別画面として処理する方法もあるんですね。
JavaScript でやる方法と、別画面でやる方法を試してみたいと思います。
ひろれい
ぬし
会議室デビュー日: 2006/03/02
投稿数: 486
お住まい・勤務地: 万博開催地
投稿日時: 2006-04-28 14:17
引用:

ひろれいさんの書き込み (2006-04-28 13:51) より:

別画面として処理する方法もあるんですね。
JavaScript でやる方法と、別画面でやる方法を試してみたいと思います。


他にもダウンロードする画面があるため、今回はぼのぼのさんから教えていただいた別画面でダウンロードする方法で対応することにしました。

簡単に修正できました。ありがとうございました。
1

スキルアップ/キャリアアップ(JOB@IT)