2008-08-26 18 views
31

jQueryajax methodを使用してフォームデータを送信する場合、エラーを処理する最善の方法は何ですか? これは、コールがどのように見えるかの例です:jQuery.ajax()の使用時にエラーをどのように処理しますか?

などなど重複したユーザー名、重複した電子メールアドレスなどの理由の数、およびASHXのために失敗することがありますリクエストが例外をスローするように書かれている

$.ajax({ 
    url: "userCreation.ashx", 
    data: { u:userName, p:password, e:email }, 
    type: "POST", 
    beforeSend: function(){disableSubmitButton();}, 
    complete: function(){enableSubmitButton();}, 
    error: function(xhr, statusText, errorThrown){ 
      // Work out what the error was and display the appropriate message 
     }, 
    success: function(data){ 
      displayUserCreatedMessage(); 
      refreshUserList(); 
     } 
}); 
これが起こるとき。

私の問題は、例外をスローすることによってASHXがstatusTexterrorThrown未定義されるようにすることのようです。

XMLHttpRequest.responseTextには、標準の.netエラーページを構成するHTMLが含まれています。

私はresponseTextでページタイトルを探していて、タイトルを使用してどのエラーが発生したかを調べています。カスタムエラー処理ページを有効にすると、これが崩れてしまうのではないかと疑いがあります。

ashxでエラーをスローするか、userCreation.ashxへの呼び出しによって返されたデータの一部としてステータスコードを返す必要がありますか?これを使用して、実行するアクションを決定します。
これらの状況をどのように処理しますか?

答えて

16

私は ASHXでエラーを投げれるべきか、私はデータの一部として ステータスコードを返すべきである userCreation.ashxへの呼び出しによって返され、その後、 にこれを使用すると、どのようなアクションを決めます取る?どのようにこれらの状況を処理する ですか?

可能であれば、私はこれをサーバー側で処理し、そこでユーザーにメッセージを送ることを好みます。これは、ユーザーに何が起こったかを伝えるメッセージ(本質的には検証メッセージ)を表示したいというシナリオではうまく機能します。

しかし、サーバーで起こったことに基づいてアクションを実行する場合は、ステータスコードを使用し、そのステータスコードに基づいてさまざまなアクションを実行するためにJavaScriptを書き込むことができます。デバッグのために

20

、私は通常ちょうど(以下場合:<div id="error"></div>)要素を作成ページとそれにXmlHttpRequestのを書く:

error: function (XMLHttpRequest, textStatus, errorThrown) { 
    $("#error").html(XMLHttpRequest.status + "\n<hr />" + XMLHttpRequest.responseText); 
} 

次に、あなたが発生しているエラーの種類を見ることができますし、それらを正しくキャプチャ:あなたASHXで

if (XMLHttpRequest.status === 404) // display some page not found error 
if (XMLHttpRequest.status === 500) // display some server error 

を、あなたは新しい例外(たとえば、「無効なユーザー」など)を投げ、その後、ちょうどXMLHttpRequest.responseTextの外にそれを解析することができますか?私にとっては、エラーが発生した場合XMLHttpRequest.responseTextは標準のAspではありません。純エラーページは、このようなエラーを含むJSONオブジェクトです:

{ 
"Message":"Index was out of range. Must be non-negative and less than the size of the collection.\r\n 
Parameter name: index", 
"StackTrace":" at System.ThrowHelper.ThrowArgumentOutOfRangeException(ExceptionArgument argument, ExceptionResource resource)\r\n 
at etc...", 
"ExceptionType":"System.ArgumentOutOfRangeException" 
} 

編集:私は呼んでいる関数はこれらの属性でマークされているので、これは次のようになります。

<WebMethod()> _ 
<ScriptMethod()> _ 
+0

1:どうもありがとうございました。 –

+0

@Ismail私は新しい質問でこれを尋ね、あなたのコードのいくつかを提供するべきだと思います。 – travis

4

今私が持っていますどの答えを受け入れるかという問題。

さらに問題を考えると、間違って例外を投げているという結論に至りました。重複したユーザー名、電子メールアドレスなどは、登録プロセス中に予想される問題であり、したがって例外ではなく、単にエラーです。私はおそらく例外を投げてはいけませんが、エラーコードを返すべきです。

これは、特にフォームが表示されているUIのほんの一部であるため、この場合にはirobinson'sのアプローチをとるべきだと私に思っています。私は今このソリューションを実装して、表示されるステータスとオプションのメッセージを含むXMLを返します。私はそれを解析し、適切な行動を取ることにjQueryを使用することができます: -

success: function(data){ 
    var created = $("result", data).attr("success"); 
    if (created == "OK"){ 
     resetNewUserForm(); 
     listUsers(''); 
    } else { 
     var errorMessage = $("result", data).attr("message"); 
     $("#newUserErrorMessage").text(errorMessage).show(); 
    } 
    enableNewUserForm(); 
} 

しかしtravis'答えは非常に詳細で、デバッグ中に完璧になるか、私は、ユーザーに例外メッセージを表示したい場合。私は間違いなくJSONを受け取っていないので、トラビスがリストアップしている属性のうちの1つに、おそらく私のコードの中にそれらがないので、おそらくそれが下です。

(私はirobinsonの答えを受け入れるために行くが、upvoteトラヴィスと答えていますそれはちょうど最も多くの票を持っていない答えを受け入れることが不思議な感じ。。)

関連する問題