私は非常にうまく機能しているjqgridを持っています。
サーバーから送信されたエラーをキャッチすることは可能ですか?それはどのように行われますか?
最近、シービー・リチャードエリス(私の雇用主)のために取り組んでいるプロトタイププロジェクトにjqgridを多用しました。 documentation :(「データの取得」ノードを参照)に記載されているように、jqgridにデータを入力する方法はたくさんあります。
現在、json文字列を返すサービス呼び出しを行っています。この文字列は、評価されると、次を含むオブジェクトを取得します。
成功のコールバックでは、次のように手動で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」イベントが表示されます。
jqgridデモサイト を見て、「バージョン3.2の新機能」を見ると、サーバーエラーの制御に関するセクションがあるはずです。
具体的には、コールバックパラメータloadErrorを使用します。
loadError : function(xhr,st,err) {
jQuery("#rsperror").html("Type: "+st+"; Response: "+ xhr.status + " "+xhr.statusText);
}
Mcvが上記で述べているように、一部のエラーはデータエラーであるため、それらを具体的に処理する必要があります。
コールバックを使用します。実際の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); }); }
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)
}
覚えておくべきもう1つのこと/または私が見つけたのは、Asp.netを使用している場合はターンする必要があるということです
セクション内-これにより、戻ってくるメッセージを内省することもできます。
オプションで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オブジェクトからメッセージを取得できます。
私が見るところ、それはデータを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
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) },
結局、それは私が思うのと同じアプローチを使用します。
皆さんありがとう