0

これは私を狂わせています、私はグーグルで見たすべての記事を読みました、そしてここでそして2日後、101の変種の後私はまだそれ以上前進していません。

成功201は完全に機能し、バインドされたアイテムでアラートを受け取ります。404はまったく機能しません。何を試しても、ErrorDescは常に未定義です。固定文字列でこの404関数をヒットできるように動作させましたが、エラーが発生した理由をユーザーに知らせてもらいたいです。

私はフィドラーを使用してリクエストとレスポンスを確認しました。見た目は問題ありません。リクエストとレスポンスの両方が整形式のJSONです。

生のリクエスト:

{"Bedrooms":"3","BuildingsAD":"Yes","BuildingsMD":"No","BulidingSI":"100000","ContentsAD":"No","ContentsMD":"No","ContentsPOL":"No","ContentsSI":"5000","EffectiveDate":"03/10/2012 23:40:10","EL":"N","MD":"No","NCD":"1","POL":"No","PropType":"Terraced","RiskPostcode":"SW19 1TS","SchemeRef":"20","TA":"No","TenantTheft":"No","TenantType":"Professional","Theft":"No","TransactionDate":"03/10/2012 23:40:10","VolExcess":"250","YearBuilt":"2000 +","ErrorDesc":"123"}

Raw Response:

{"RatingId":"f5733e9d-bc9d-4026-8d5f-ce4f750a3a42","SchemeRef":"20","EffectiveDate":"03/10/2012 23:40:10","TransactionDate":"03/10/2012 23:40:10","Bedrooms":"3","BuildingsAD":"Yes","BuildingsMD":"No","BulidingSI":"100000","ContentsAD":"No","ContentsMD":"No","ContentsPOL":"No","ContentsSI":"5000","EL":"N","MD":"No","NCD":"1","POL":"No","PropType":"Terraced","RiskPostcode":"SW19 1TS","TA":"No","TenantTheft":"No","TenantType":"Professional","Theft":"No","VolExcess":"250","YearBuilt":"2000 +","Error":true,"ErrorDesc":"Rating Sheet not found"}


    <script type="text/javascript">

        function CalcRating() {
            //create a Json object based on data entered by user
            var RatingItems = {
                AD: $("#AD").val(),
                AdminFee: $("#AdminFee").val(),
                Bedrooms: $("#Bedrooms").val(),
                BuildingsAD: $("#BuildingsAD").val(),
                BuildingsMD: $("#BuildingsMD").val(),
                BuildingsPremium: $("#BuildingsPremium").val(),
                BulidingSI: $("#BulidingSI").val(),
                ContentsAD: $("#ContentsAD").val(),
                ContentsMD: $("#ContentsMD").val(),
                ContentsPOL: $("#ContentsPOL").val(),
                ContentsPremium: $("#ContentsPremium").val(),
                ContentsSI: $("#ContentsSI").val(),
                EffectiveDate: $("#EffectiveDate").val(),
                EL: $("#EL").val(),
                IPT: $("#IPT").val(),
                MD: $("#MD").val(),
                NCD: $("#NCD").val(),
                POL: $("#POL").val(),
                PropType: $("#PropType").val(),
                RatingId: $("#RatingId").val(),
                RiskPostcode: $("#RiskPostcode").val(),
                SchemeRef: $("#SchemeRef").val(),
                TA: $("#TA").val(),
                TenantTheft: $("#TenantTheft").val(),
                TenantType: $("#TenantType").val(),
                Theft: $("#Theft").val(),
                TransactionDate: $("#TransactionDate").val(),
                TotalPremium: $("#TotalPremium").val(),
                VolExcess: $("#VolExcess").val(),
                YearBuilt: $("#YearBuilt").val(),
                ErrorDesc: "123"
            };
            //call jQuery Ajax method which calls Json.stringify method to convert
            //the Json object into string and send it with post method
            $.ajax({
                url: "/api/qsletpropertyom",
                data: JSON.stringify(RatingItems),
                type: "POST",
                contentType: "application/json;charset=utf-8",
                statusCode: {
                    201: function (result) {
                        alert("Total Premium: " + result.TotalPremium + ", Total Buildings Premium " + result.BuildingsPremium + ", Total Contents Cover " + result.ContentsPremium + ", Admin Fee " + result.AdminFee);
                    },
                    404: function (result1) {

                        alert(result.ErrorDesc);

                    },
                    500: function (result2) {
                        alert("Unknown Error");
                    }

                }
            });
        }

私のやり方の誤りを教えてください!

4

2 に答える 2

1

問題は、404 ケースの最初の引数として応答テキストを取得することを期待していることだと思いますが、これは jQuery が返すものではありません。

jQuery docsから取得した情報を次に示します。

statusCode(1.5追加)Map

リクエストが成功した場合、ステータス コード関数は成功コールバックと同じパラメータを受け取ります。エラーが発生した場合は、エラー コールバックと同じパラメータを取ります

error(jqXHR, textStatus, errorThrown) 関数

リクエストが失敗した場合に呼び出される関数。関数は 3 つの引数を受け取ります。jqXHR (jQuery 1.4.x では XMLHttpRequest) オブジェクト、発生したエラーの種類を説明する文字列、およびオプションの例外オブジェクト (発生した場合) です。2 番目の引数 (null 以外) に指定できる値は、"timeout"、"error"、"abort"、および "parsererror" です。HTTP エラーが発生すると、errorThrown は「Not Found」や「Internal Server Error」などの HTTP ステータスのテキスト部分を受け取ります。jQuery 1.5 以降、エラー設定は関数の配列を受け入れることができます。各関数が順番に呼び出されます。注: このハンドラは、クロスドメイン スクリプトおよび JSONP リクエストでは呼び出されません。これは Ajax イベントです。

成功(データ、テキストステータス、jqXHR)関数、配列

リクエストが成功した場合に呼び出される関数。この関数には 3 つの引数が渡されます。dataType パラメータに従ってフォーマットされた、サーバーから返されたデータ。ステータスを説明する文字列。jqXHR (jQuery 1.4.x では XMLHttpRequest) オブジェクト。jQuery 1.5 以降、success 設定は関数の配列を受け入れることができます。各関数が順番に呼び出されます。これは Ajax イベントです。

ご覧のとおり、HTTP エラーが発生したときに、応答データ オブジェクトが引数として渡されません。

于 2012-10-04T12:04:27.213 に答える
1

まず第一に、result.ErrorDescおそらく期待していたときに使用していますがresult1.ErrorDesc、それは単なるタイプミスだと思います。

第二に、私が正しければ、ajax が 404 (ページが見つからない) に達したときにエラーの説明をユーザーに表示したいですか? その場合、404 ハンドラーに渡されるデータがないため、おそらくそれを行うことはできません。

errorおそらく、ajax (http://api.jquery.com/jQuery.ajax/) のオプションのような何かを探しているでしょう。

jQueryのドキュメントから:error「リクエストが失敗した場合に呼び出される関数。関数は3つの引数を受け取ります。jqXHR(jQuery 1.4.xでは、XMLHttpRequest)オブジェクト、発生したエラーのタイプを説明する文字列、およびオプションの例外オブジェクトです。 2 番目の引数 (null 以外) に指定できる値は、"timeout"、"error"、"abort"、および "parsererror" です。HTTP エラーが発生すると、errorThrown は " 「見つかりません」または「内部サーバー エラー。」jQuery 1.5 の時点で、エラー設定は関数の配列を受け入れることができます。各関数は順番に呼び出されます。注: このハンドラーは、クロスドメイン スクリプトおよび JSONP 要求では呼び出されません。

$.ajax({
    url: "/api/qsletpropertyom",
    data: JSON.stringify(RatingItems),
    type: "POST",
    contentType: "application/json;charset=utf-8",
    error: function(jqXHR, textStatus, errorThrown) {
        // textStatus will contain "Not Found" for 404 errors
    }
});

編集:どうやら、statusCodeマップ定義で使用される 404 ハンドラー (あなたが行ったように) は、errorオプションと同様に 3 つの引数を取得します。これが実際の例です:http://jsfiddle.net/QsHdV/2/

そこで得られる最初の引数は、結果データではなくjquery XHRオブジェクトであることに注意してください。

于 2012-10-04T11:57:54.663 に答える