none
alert表示について RRS feed

  • 質問

  • またお世話になります。

    今回はalertについて教えて下さい。

    以下のurlを参照しalert表示を出したいのですが出てくれません。

    http://www.atmarkit.co.jp/fdotnet/vs2005db/vs2005db_10/vs2005db_10_04.html

    コードはPage.ClientScript.RegisterStartupScript(Me.GetType(), "err", "window.alert('エラー');", True)です。

     

    処理としましては①ダウンロードボタンクリック②ダウンロード中になんらかのエラー発生時③上記alert表示

     

    何か特別に設定が必要なのでしょうか?

    宜しくお願いします。

    2007年3月30日 7:33

回答

  • もうすこし具体的に、
    ・いつどこで
    ・なにを目的に
    ・期待する結果は
    といったことを記載されると、返信がつきやすいかもしれません。
    とくに、ASP.NET の場合は、リクエスト/レスポンスの関係が読み取れるような状態遷移を書かないと、まったく予想がつきません。
     
    RegisterStartupScript は、名前の通り Web ページが表示されたときに実行されるスクリプトを登録します。
    (あまり「~~の時に」といった場合わけに利用されることは少ないイメージです)
     
    とりあえず、何も配置していない空のページで、OnLoad イベントにてスクリプトを登録すると、きちんと動作しますよね?
    記載されている処理を可能な範囲で予測すると、
     
    1.ダウンロードのリンクがあるページ A.aspx と、エラー時のページ B.aspx を作成している。
       B.aspx の OnLoad イベントにて RegisterStartupScript が記載されている
     
    2.ユーザが A.aspx を押してダウンロードボタンをクリックしてダウンロードが開始する
       (もしくはボタンでポストバックしている?)
     
    3.ダウンロードが成功しても失敗しても B.aspx は表示されないので alert も表示されない
     
    というような状態でしょうか?
    「ダウンロード」と「ダウンロードのエラー検出」をどのようにしてやっているかが不明ですし、Web ではコレといった方法も確立されていなく、定番的な手法がいくつもあるので、それらについて記載されないと、見ている人には何もわからないというかんじです。
     
     
    2007年3月31日 4:16
  • 詳しく見ていないんですが、最後のResponse.Redirect("~/test/XXX.aspx", False)が原因のように思います。
    折角javascriptでalertを書き出しても、そのページにポストバックされるのではなく、他のページにリダイレクトされてしまうんじゃないかと思います。そのリダイレクトされたページにはalertが無いので、当然、alertは表示されないことになります。
    2007年4月2日 7:08
    モデレータ
  • これかな?

    [PRB] Response.End、Response.Redirect、または Server.Transfer メソッドを使用すると ThreadAbortException が発生する
     http://support.microsoft.com/default.aspx?scid=kb;ja-jp;312629

    2007年4月2日 9:09
    モデレータ

すべての返信

  • もうすこし具体的に、
    ・いつどこで
    ・なにを目的に
    ・期待する結果は
    といったことを記載されると、返信がつきやすいかもしれません。
    とくに、ASP.NET の場合は、リクエスト/レスポンスの関係が読み取れるような状態遷移を書かないと、まったく予想がつきません。
     
    RegisterStartupScript は、名前の通り Web ページが表示されたときに実行されるスクリプトを登録します。
    (あまり「~~の時に」といった場合わけに利用されることは少ないイメージです)
     
    とりあえず、何も配置していない空のページで、OnLoad イベントにてスクリプトを登録すると、きちんと動作しますよね?
    記載されている処理を可能な範囲で予測すると、
     
    1.ダウンロードのリンクがあるページ A.aspx と、エラー時のページ B.aspx を作成している。
       B.aspx の OnLoad イベントにて RegisterStartupScript が記載されている
     
    2.ユーザが A.aspx を押してダウンロードボタンをクリックしてダウンロードが開始する
       (もしくはボタンでポストバックしている?)
     
    3.ダウンロードが成功しても失敗しても B.aspx は表示されないので alert も表示されない
     
    というような状態でしょうか?
    「ダウンロード」と「ダウンロードのエラー検出」をどのようにしてやっているかが不明ですし、Web ではコレといった方法も確立されていなく、定番的な手法がいくつもあるので、それらについて記載されないと、見ている人には何もわからないというかんじです。
     
     
    2007年3月31日 4:16
  • 返信遅くなりましてすいません。

    単純にエラーチェックを行った後にエラーがあったらエラーダイアログを出したいだけなのですが、うまく説明ができず申し訳ありません。

    >りあえず、何も配置していない空のページで、OnLoad イベントにてスクリプトを登録すると、きちんと動作しますよね?

    はい。動作します。根本的にRegisterStartupScriptの考えかたが間違っているのでしょうか?

    OnLoadイベント内に書かなくてだめなんでしょうか?(参照URL内ではsds_Deletedに記載されている)
     
     
    >1.ダウンロードのリンクがあるページ A.aspx と、エラー時のページ B.aspx を作成している。
    >   B.aspx の OnLoad イベントにて RegisterStartupScript が記載されている
    エラー時のページB.aspxは作成していません。(A.aspxの1画面で構成しています。)
    RegisterStartupScript が記載されているのはA.aspx内のダウンロードボタンイベント内です。
     
    >2.ユーザが A.aspx を押してダウンロードボタンをクリックしてダウンロードが開始する
    >   (もしくはボタンでポストバックしている?)
    そのとうりです。ポストバックはしていません。但し、ダウンロードイベント内の最後にA.aspxへResponse.Redirectしています。
     
    >3.ダウンロードが成功しても失敗しても B.aspx は表示されないので alert も表示されない
    ダウンロード時に何らかのエラーが発生した場合にのみalert表示させたいのですが表示されない。
     
     
    うまく説明ができないので以下にコードを貼り付けます。
     
    ダウンロードイベントコード ↓
        Protected Sub btn_DL_Click(ByVal sender As Object, ByVal e As System.EventArgs)
            Dim dv As DataView = CType(SqlDataSource5.Select(DataSourceSelectArguments.Empty), DataView)
            Dim objDownLoad As New DownLoad <-- エラーチェッククラス
            Dim err_flg As String = 0
            If objDownLoad.DownLoad_rtn("XXX", dv) = 0 Then <-- エラーチェック
                Try   <--例外チェック
                    Response.ContentType = "application/octet-stream"
                    Response.AddHeader("content-disposition", "attachment; filename=" + System.Web.HttpUtility.UrlEncode("~/work/XXX1.xls"))
                    Response.WriteFile("~/work/XXX1.xls", False)
                    Response.Flush()
                    Response.End()
                Catch ex As Exception
                    err_flg = 1
                End Try
            Else
                err_flg = 1
            End If
            If err_flg = 1 Then
                Page.ClientScript.RegisterStartupScript(Me.GetType(), "err", "window.alert('エラー');", True)
            End If
            Response.Redirect("~/test/XXX.aspx", False)
        End Sub
    基本的なこととは思いますが宜しくお願いします。
    2007年4月2日 2:54
  • 詳しく見ていないんですが、最後のResponse.Redirect("~/test/XXX.aspx", False)が原因のように思います。
    折角javascriptでalertを書き出しても、そのページにポストバックされるのではなく、他のページにリダイレクトされてしまうんじゃないかと思います。そのリダイレクトされたページにはalertが無いので、当然、alertは表示されないことになります。
    2007年4月2日 7:08
    モデレータ
  • trapemiyaさん

    いつもいつもありがとうございます。

     

    trapemiyaさんがおっしゃるとうり、Response.Redirectをはずしerr_flgを常に"1"にしTRY ~TRY ENDまでをコメントにした状態で実行したら無事ダイアログが表示されました。

     

    ただResponse.Redirectを上記のコードから削除した状態でデバックしたところResponse.End()からステップインすると"'System.Threading.ThreadAbortException' の初回例外が mscorlib.dll で発生しました。"となりCatch ex As Exception内のerr_flg = 1を過ぎたところからコードが実行していないようですがこれで正常でしょうか?また、"'System.Threading.ThreadAbortException' の初回例外が mscorlib.dll で発生しました。"のエラーはどういうエラーでしょうか?この時、ファイルのダウンロードダイアログは開いた状態です。

     

    2007年4月2日 7:43
  • これかな?

    [PRB] Response.End、Response.Redirect、または Server.Transfer メソッドを使用すると ThreadAbortException が発生する
     http://support.microsoft.com/default.aspx?scid=kb;ja-jp;312629

    2007年4月2日 9:09
    モデレータ
  • K.Takaoka さん、trapemiyaさん

     

    お陰様で意図したことができました。

    今後とも宜しくお願いします。m(__)m

    2007年4月3日 3:04