none
ファイルダウンロードの際の元画面制御について RRS feed

  • 質問

  • お世話になっております。

     

    現在、VS.NET2005、ASP2.0 で開発しています。

     

    webページの印刷ボタンを押下すると
    はい、いいえ、キャンセルボタンがあるダイアログ(A)が現れ、
    「はい」を押下→印刷→ダイアログ(A)を閉じる
    「いいえ」を押下→ファイルダウンロード→ダイアログ(A)を閉じる
    「キャンセル」を押下→ダイアログ(A)を閉じる
    という仕様になっています。

     

    「はい」の場合は、仕様通りにダイアログ(A)を閉じます。
    「いいえ」の場合は、ファイルダウンロードダイアログが表示され
    ダイアログ(A)は閉じないままです。

     

    以下に、コードを記します。
    ファイルダウンロードダイアログを表示しつつ
    元の画面を閉じることは出来ないのでしょうか?

     

     Protected Sub btnYes_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnYes.Click

            Dim repUrl As String = ""
            If Not IsNothing(Session("REPURL")) Then
                repUrl = Session("REPURL").ToString
            End If

     

            Dim script As StringBuilder = New StringBuilder()

            script.Append("<script language='JavaScript'>")
            script.Append("window.open('" + repUrl + "', '_blank');")
            script.Append("window.close();")
            script.Append("</script>")

            ScriptManager.RegisterClientScriptBlock(Me, GetType(Page), "OpenWindow", script.ToString(), False)

        End Sub

     

        Protected Sub btnNO_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnNO.Click

            'レスポンスに対して各種設定をする
            Response.ContentType = "application/download"
            Response.AppendHeader("Content-Disposition", "attachment;filename=default.txt")
            Response.ContentEncoding = Encoding.GetEncoding("Shift_JIS")
            If Not IsNothing(Session("TEXT")) Then
                Response.Write(Session("TEXT").ToString)
            End If
            Response.End()

     

            Dim script As StringBuilder = New StringBuilder()

            script.Append("<script language='JavaScript'>")
            script.Append("window.close();")
            script.Append("</script>")

            ScriptManager.RegisterClientScriptBlock(Me, GetType(Page), "CloseWindow", script.ToString(), False)

        End Sub


     

    2008年12月25日 7:08

回答

  • 実際に検証していないので、いまいち自信はありませんが、以下の方法で
    試してみてはいかがでしょうか?

     

    <その1>
    「はい」の方は「ダイアログ(A)」がうまく閉じるということのようです
    ので、ダウンロードするための Web フォーム(例: download.aspx)を
    別に作って、「はい」の場合と同様に、

     

    Code Snippet

    script.Append("window.open('download.aspx', '_blank');")
    script.Append("window.close();")

     

     

    のようにする。

     

    <その2>
    btnNO_Click は Response.Redirect("download.aspx") のみとし、ボタンの
    OnClientClick プロパティに、ブラウザを閉じるための JavaScript を設定
    する。例えば、

     

    Code Snippet

    onclientclick="BLOCKED SCRIPTsetTimeout('self.close()', 1000);"

     

     

    以前 IE7 で試したとき、self.Close() のみでは閉じなかったので、上記の
    ようしました。ブラウザによるのかもしれませんが、タイミングが問題のよ
    うです。また、閉じられる前に「ウィンドウは、表示中の Web ページにより
    閉じられようとしています。このウィンドウを閉じますか?」という確認ダ
    イアログが出て、うっとうしいかも知れません。

    2008年12月25日 12:45

すべての返信

  • 実際に検証していないので、いまいち自信はありませんが、以下の方法で
    試してみてはいかがでしょうか?

     

    <その1>
    「はい」の方は「ダイアログ(A)」がうまく閉じるということのようです
    ので、ダウンロードするための Web フォーム(例: download.aspx)を
    別に作って、「はい」の場合と同様に、

     

    Code Snippet

    script.Append("window.open('download.aspx', '_blank');")
    script.Append("window.close();")

     

     

    のようにする。

     

    <その2>
    btnNO_Click は Response.Redirect("download.aspx") のみとし、ボタンの
    OnClientClick プロパティに、ブラウザを閉じるための JavaScript を設定
    する。例えば、

     

    Code Snippet

    onclientclick="BLOCKED SCRIPTsetTimeout('self.close()', 1000);"

     

     

    以前 IE7 で試したとき、self.Close() のみでは閉じなかったので、上記の
    ようしました。ブラウザによるのかもしれませんが、タイミングが問題のよ
    うです。また、閉じられる前に「ウィンドウは、表示中の Web ページにより
    閉じられようとしています。このウィンドウを閉じますか?」という確認ダ
    イアログが出て、うっとうしいかも知れません。

    2008年12月25日 12:45
  • 上記のコードで BLOCKED SCRIPT となっているところは「ジャワスクリプト:」の
    英小文字です。

     

    セキュリティ対策か、勝手に変換されてしまいます。

    2008年12月25日 13:15
  • こんにちは。中川俊輔です。

     

    SurferOnWwwさん、回答ありがとうございます。

     

    taisho2008さん、フォーラムのご利用ありがとうございます。

    その後いかがでしょうか?SurferOnWwwさんの方法はうまくいきましたか?

    有用な情報と思われたため、SurferOnWwwさんの回答へ回答済みチェックをつけさせていただきました。

     

    今後ともフォーラムをよろしくお願いします。

    それでは!

    2009年1月8日 9:05