web-dev-qa-db-ja.com

JQGridにサーバー送信エラーを認識させるにはどうすればよいですか?

私は非常にうまく機能しているjqgridを持っています。

サーバーから送信されたエラーをキャッチすることは可能ですか?それはどのように行われますか?

22
ZeroCool

最近、シービー・リチャードエリス(私の雇用主)のために取り組んでいるプロトタイププロジェクトにjqgridを多用しました。 documentation :(「データの取得」ノードを参照)に記載されているように、jqgridにデータを入力する方法はたくさんあります。

現在、json文字列を返すサービス呼び出しを行っています。この文字列は、評価されると、次を含むオブジェクトを取得します。

  • ColumnNames:string []
  • ColumnModels:object [](各オブジェクトには「name」、「index」、「sortable」のプロパティがあります)
  • データ:object [](各オブジェクトには列モデルの名前と一致するプロパティがあります)
  • TotalRows:int

成功のコールバックでは、次のように手動でjqgridを作成します(「data」は、返されたjson文字列を評価するときに取得するオブジェクトです)。

var colNames = data.ColumnNames;
var colModel = data.ColumnModels;
var previewData = data.PreviewData;
var totalRows = data.TotalRows;
var sTargetDiv = userContext[0]; // the target div where I'll create my jqgrid

$("#" + sTargetDiv).html("<table cellpadding='0' cellspacing='0'></table>");
var table = $("#" + sTargetDiv + " > table");
table.jqGrid({
    datatype: 'local',
    colNames: colNames,
    colModel: colModel,
    caption: 'Data Preview',
    height: '100%',
    width: 850,
    shrinkToFit: false
});

for (var row = 0; row < previewData.length; ++row)
    table.addRowData(row, previewData[row]);

手動でデータを入力していることがわかります。複数の種類のサーバーエラーがあります。論理エラーがあります。これは、json文字列のプロパティとして返され、jqgridを作成する前に(または行ごとに)確認できます。

if (data.HasError) ...

または行ごとに

for (var row = 0; row < previewData.length; ++row)
{
    if (previewData[row].HasError)
        // Handle error, display error in row, etc
        ...
    else
        table.addRowData(row, previewData[row]);
}

エラーがサーバーで未処理の例外である場合は、非同期呼び出しでエラーコールバックが必要になる可能性があります。この場合、(おそらく)jqgridを作成している成功コールバックはまったく呼び出されません。

もちろん、これはjqgridに手動で入力する場合にも当てはまります。これは、利用可能な多くのオプションの1つにすぎません。 jqgridをサービス呼び出しまたはデータを取得する関数に直接配線している場合、それはまったく別のことです。

ドキュメントページで、[基本グリッド]> [イベント]を確認します。便利な「loadError」イベントが表示されます。

7
Samuel Meacham

jqgridデモサイト を見て、「バージョン3.2の新機能」を見ると、サーバーエラーの制御に関するセクションがあるはずです。

具体的には、コールバックパラメータloadErrorを使用します。

loadError : function(xhr,st,err) { 
    jQuery("#rsperror").html("Type: "+st+"; Response: "+ xhr.status + " "+xhr.statusText);
}

Mcvが上記で述べているように、一部のエラーはデータエラーであるため、それらを具体的に処理する必要があります。

19
r00fus

コールバックを使用します。実際のhttpエラー(たとえば、400または500)が発生すると、loadError(xhr、status、error)がトリガーされます。

ただし、一部のエラー(検証など)は400または500エラーをスローするべきではありません。ただし、loadComplete(xhr)でそれらをキャッチすることはできます。 jsonを解析し、エラーを特定するために使用している方法を確認します。たとえば、loadComplete()でこれを行っています。

if (jsonResponse.errors) { $.each(jsonResponse.errors, function(i, val){ addErrorMessage($("#"+val.field), val.message); }); }

3
mcv

JqGrid定義でloadErrorイベントを使用できます( ドキュメント を参照)。例えば。:

//Catch errors
loadError = function(xhr, textStatus, errorThrown)  {
    var error_msg = xhr.responseText        
    var msg = "Some errors occurred during processing:"
    msg += '\n\n' + error_msg
    alert(msg)
    }
2
Don

覚えておくべきもう1つのこと/または私が見つけたのは、Asp.netを使用している場合はターンする必要があるということです

セクション内-これにより、戻ってくるメッセージを内省することもできます。

1
Nutshell

オプションでjqGridを使用している場合

_            ajaxGridOptions: { contentType: 'application/json; charset=utf-8' },
            datatype: "json",
            url: wsPath
_

AJAXおよびWebサービスまたはMVCコントローラーを介してデータをロードする場合、この答えはあなたにぴったりです。

AJAX呼び出しを処理するWebメソッドでランタイムエラーが発生した場合、loadErrorはHTTP関連のエラーのみをキャッチするため、loadErrorを介してキャッチすることはできません。 web methodのエラーを_try ... catch_経由でキャッチし、_return JsonString_を使用してcatchブロックでJSON形式で渡す必要があります。その後、loadCompleteイベントで処理できます。 :

_loadComplete: function (data) {
                    if (this.p.datatype === 'json') {
                        if (data!==undefined && data!==null && isErrorJson(data)) {
                            ShowErrorDialog(getJsonError(data));
                        }
                // ...
              }
_

上記の関数には次の意味があり、必要に応じて実装します。

  • isErrorJson(data):データオブジェクトにWebメソッドで定義されたエラーが含まれている場合、trueを返します
  • getJsonError(data):Webメソッドで定義されたエラーメッセージを含む文字列を返します
  • ShowErrorDialog(msg):エラーメッセージを画面に表示します。例: jQueryUIダイアログ経由。

Webサービスメソッドでは、JavaScriptSerializerを使用してこのようなエラーオブジェクトを作成できます。上記の2つのJavaScriptメソッドでは、jQuery関数$.parseJSON(data.d)を使用してJSONオブジェクトからメッセージを取得できます。

1
Matt

私が見るところ、それはデータをjson文字列として返します。したがって、あなたがしなければならないのは、エラーをjson文字列としてフォーマットし、それを1つとして出力するエラーハンドラーを追加することです。これは、phpで行うことができます

set_error_handler

関数。

エラーハンドラーは、データをjsonReturn.errorにプッシュすると推測するので、データをテーブルに追加するときに、それを確認する必要があります。

エラーが発生するのではなく、例外をスローする場合(おそらくより良い方法です)、例外をjson文字列としてフォーマットすることをお勧めします。

データをxml形式で返すため、xmlを解析する必要があります。

<xml>
    <error>
        error message
    </error>
</xml>

このような:

$(request.responseXML).find("error").each(function() {
        var error = $(this);
        //do something with the error
});

恥知らずに借りたもの: http://marcgrabanski.com/article/jquery-makes-parsing-xml-easy

1
SeanJA
function gridCroak(postdata, _url, grid, viewCallBack, debug) {
$(".loading").css("display", "block");
$.ajax({
    type: 'POST',
    url: _url,
    data: postdata,
    dataType: "xml",
    complete: function(xmldata, stat){
    if(stat == "success") {
        $(".loading").css("display", "none");
        var errorTag = xmldata.responseXML.getElementsByTagName("error_")[0];
        if (errorTag) {
        $("#ErrorDlg").html(errorTag.firstChild.nodeValue);
        $("#ErrorDlg").dialog('open');
        } else {
        var warningTag = xmldata.responseXML.getElementsByTagName("warning_")[0]; 
        if (warningTag) {
            $("#WarningDlg").html(warningTag.firstChild.nodeValue);
            $("#WarningDlg").dialog('open');
        } else {
            if (debug == true) {
            alert(xmldata.responseText);
            }
            jQuery(grid)[0].addXmlData(xmldata.responseXML);
            if(viewCallBack) viewCallBack();
        }
        }
    } else {
        $("#ErrorDlg").html("Servizio Attualmente Non Disponibile !");
        $("#ErrorDlg").dialog('open');
    }
    }
});
}

そしてグリッドで

datatype : function(postdata) { gridCroak(postdata, 'cgi-bin/dummy.pl?query=stock', 
                                                    "#list", null, false) },

結局、それは私が思うのと同じアプローチを使用します。

皆さんありがとう

0
ZeroCool