2013-08-27 7 views
18

次のコードをUpdate Panelの下にあるページに書きました。ここでResponse.Redirect()を使用しているときにスレッドの中止例外を取得する

protected void myGrid_RowCommand(object sender, GridViewCommandEventArgs e) 
     { 
      try 
      { 
       if (e.CommandName =="EditNames") 
       { 
        long lSelectedName = Convert.ToInt64(e.CommandArgument); 
        Session["SelectedItem"] = lSelectedName; 
        Response.Redirect("EditItem.aspx"); 
       } 
       else if (e.CommandName =="DeleteNames") 
       { 
        long lSelectedName = Convert.ToInt64(e.CommandArgument); 
        ValidName.DeleteItem(lSelectedName); 

       ScriptManager.RegisterStartupScript(this, GetType(), "Key", "alert('Name deleted sucessfully')", true); 
       } 
      } 
      catch (System.Threading.ThreadAbortException) 
      { 

      } 
      catch (Exception ex) 
      { 
       Error handling code... 
      } 

リダイレクトながら、私は、スレッドアボート例外を取得しています。どのように、私はエラーハンドラSystem.threading.ThreadAbortExceptionを使用して解決しました。

しかし、リダイレクト中にそのエラーが発生した理由がわかりません。 、私はこの問題を解決したとしても、私は...あなたの入力を与えるすべての

で焼成し、エラーを停止するにはどのような方法があり、私はコーディングまたはAMの方法のいずれかの間違いがある知っていただきたいと思います

ページが、私はこの問題を解決していますが、私が知りたいのです

+1

[なぜResponse.Redirectが原因でSystem.Threading.ThreadAbortExceptionが発生するのですか?](http://stackoverflow.com/questions/2777105/why-response-redirect-causes-system-threading-threadabortexception) –

答えて

20

AJAXの更新パネルの下にある、ということに注意することは、私は

をコーディングしています方法で、間違いがあります

間違いなく、あなたはうまくいっています。

このエラーは、発生します。これは、リダイレクト時にサーバースレッドが実際に中断されたためにスローされます。 MSDN documentationから:

あなたはendResponseパラメータにtrueを指定した場合、このメソッドは、それが完了するとThreadAbortExceptionの例外をスローし、元の要求のためのEndメソッドを呼び出します。

overload you're using:

リダイレクトのドキュメントは、完了時にThreadAbortExceptionの例外をスローエンドを呼び出します。

+0

Response.redirect( "Edititem.aspx"、false)は、スレッドアボート例外の発生を回避します。 –

+2

@Avinash、例外を回避しますが、応答も閉じないため、リダイレクトは '自分で終了する。 'End'を呼び出すと、例外はスローされます。 –

+4

2番目のオーバーロードに 'false'を渡すと、自動的に' End'を呼び出しません。しかし、あなたがリクエストしたリダイレクトは、その応答で 'End'を呼び出すまでは起こりません。あなた自身で' End'を呼び出すと、例外が発生します。これは、例外をスローする 'Redirect'メソッドではなく、' End'メソッドです。 –

15

この記事を読んでください - 代わりに要求を終了するhttp://blogs.msdn.com/b/tmarq/archive/2009/06/25/correct-use-of-system-web-httpresponse-redirect.aspx

を、Context.ApplicationInstance.CompleteRequest()を呼び出すことにより、要求の実行パイプラインをバイパスすることをお勧めします。

だからあなたのコードは次のようになります。

Response.Redirect("TargetPage", false);  //write redirect 
context.ApplicationInstance.CompleteRequest(); // end response 
+4

Context.ApplicationInstance.CompleteRequest(); – Matt

+1

これは最初の例外を回避するので、より良い答えです。私はこのことについて数年前に知っていただろうと思っています! –

+0

Contextが大文字になっていることを確認しますが、Page.Contextオブジェクトであるため、@Ahehoによる編集は誠意を持って間違っていました。 – kaelle

0

のResponse.Redirect(「TargetPage」、偽)、同様に、リダイレクト方法で偽言及するのに十分ですが、

+4

ようこそ!これは答えですが、なぜそれがうまくいくのかについてより詳細な情報があれば、もっと役に立つかもしれません。もっと情報を追加すれば投稿がうまくいくかもしれません。 –

1

try catchの内部をリダイレクトしているからです。 あなたは良くありません。

関連する問題