33

jQueryajax メソッドを使用してフォーム データを送信する場合、エラーを処理する最善の方法は何ですか? これは、呼び出しがどのように見えるかの例です:

$.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 はこれが発生したときに例外をスローするように記述されています。

私の問題は、例外をスローすることにより、ashx がstatusTextanderrorThrownundefinedにすることです。

XMLHttpRequest.responseText標準の .net エラー ページを構成する HTML を含むにアクセスできます。

responseText でページ タイトルを見つけ、タイトルを使用してどのエラーがスローされたかを調べています。カスタムエラー処理ページを有効にすると、これが崩壊するのではないかと疑っていますが。

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

4

3 に答える 3

20

デバッグのために、私は通常<div id="error"></div>、ページ上に要素 (以下の場合: ) を作成し、それに XmlHttpRequest を書き込みます。

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

次に、発生しているエラーの種類を確認し、正しくキャプチャできます。

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

あなたのashxで、新しい例外(「無効なユーザー」など)をスローしてから、それを解析できXMLHttpRequest.responseTextますか?私にとってXMLHttpRequest.responseText、標準の Asp.Net エラー ページではないエラーが表示された場合、それは次のようなエラーを含む 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()> _
于 2008-08-26T16:32:21.480 に答える
16

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

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

ただし、サーバーで発生したことに基づいてアクションを実行する場合は、ステータス コードを使用し、そのステータス コードに基づいてさまざまなアクションを実行するための JavaScript を記述します。

于 2008-08-26T16:29:46.977 に答える
4

今、私はどの答えを受け入れるかについて問題を抱えています。

この問題についてさらに考えてみると、間違って例外をスローしていたという結論に達しました。重複したユーザー名、電子メール アドレスなどは、サインアップ プロセス中に予想される問題であり、例外ではなく単なるエラーです。その場合、おそらく例外をスローするのではなく、エラー コードを返す必要があります。

特に、フォームは表示されている UI のごく一部にすぎないため、irobinson のアプローチをこの場合に採用する必要があると思います。このソリューションを実装し、ステータスと表示されるオプションのメッセージを含む 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();
}

ただし、トラビスの回答は非常に詳細であり、デバッグ中またはユーザーに例外メッセージを表示したい場合に最適です。私は間違いなくJSONを受け取っていないので、コードにそれらがないため、travisがリストした属性の1つにかかっている可能性があります。

(私はirobinsonの答えを受け入れるつもりですが、travisの答えに賛成票を投じます。最も多くの票を持っていない答えを受け入れるのは奇妙に感じます。)

于 2008-08-27T11:24:16.923 に答える