我有一个运行良好的jqgrid。
我想知道是否有可能捕获服务器发送的错误?怎么做?
我最近在为CB Richard Ellis(我的雇主)从事的原型项目中广泛使用jqgrid。如文档中所述,有很多填充jqgrid的方法:(请参阅“检索数据”节点)。
当前,我进行服务调用,返回一个json字符串,该字符串在求值时会给我一个包含以下内容的对象:
- ColumnNames:字符串[]
- ColumnModels:object [](每个对象都具有“名称”,“索引”和“可排序”属性)
- 数据: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,这只是可用的许多选项之一。如果将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);
});
}
您可以loadError
在jqGrid定义中使用该事件(请参阅文档)。例如:
//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)
}
据我所知,它以json字符串形式返回数据。因此,您要做的是添加一个错误处理程序,该错误处理程序将错误格式设置为json字符串并将其打印为一个。这可以用
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
要记住的另一件事/或者我发现的是,如果您使用的是Asp.net,则需要
在该部分中-这还将使您能够自省返回的消息。
如果您使用带有选项的jqGrid
ajaxGridOptions: { contentType: 'application/json; charset=utf-8' },
datatype: "json",
url: wsPath
通过AJAX和Web服务或MVC控制器加载数据,那么此答案适合您。
请注意,如果在处理AJAX调用的Web方法中发生运行时错误,则无法通过loadError捕获该错误,因为loadError仅捕获与HTTP相关的错误。你还是捕获错误的Web方法通过try ... catch
,然后用它传递以JSON格式在catch块return JsonString
。然后可以在loadComplete事件中对其进行处理:
loadComplete: function (data) {
if (this.p.datatype === 'json') {
if (data!==undefined && data!==null && isErrorJson(data)) {
ShowErrorDialog(getJsonError(data));
}
// ...
}
上面的功能具有以下含义,请根据需要实现:
isErrorJson(data)
:如果数据对象包含您的Web方法中定义的错误,则返回truegetJsonError(data)
:返回包含您的Web方法中定义的错误消息的字符串ShowErrorDialog(msg)
:在屏幕上显示错误消息,例如通过jQueryUI对话框。
在Web服务方法中,您可以JavaScriptSerializer
用来创建这样的错误对象,对于上述2种JavaScript方法,您可以使用jQuery函数$.parseJSON(data.d)
从JSON对象中获取消息。
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) },
最后,它确实使用了我认为的相同方法。
谢谢大家
文章标签:jqgrid , jquery , xml
版权声明:本文为原创文章,版权归 admin 所有,欢迎分享本文,转载请保留出处!
评论已关闭!