如何让JQGrid识别服务器发送的错误?

我有一个function非常好的jqgrid。

我想知道是否可以捕获服务器发送的错误? 怎么做?

我最近广泛使用jqgrid作为我正在为CB Richard Ellis(我的雇主)工作的原型项目。 有很多方法可以填充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("
"); 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]);

所以你可以看到我手动填充数据。 有超过1种服务器错误。 存在逻辑错误,您可以将其作为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]); } 

如果您的错误是服务器上的未处理exception,那么您可能希望异步调用上出现错误回调。 在这种情况下,你的成功回调(可能)是创建你的jqgrid根本不会被调用。

当然,这适用于手动填充jqgrid,这只是众多可用选项中的一种。 如果你有jqgrid直接连接到服务调用或函数来检索数据,那么这完全是另一回事。

在文档页面上,查看“基本网格”>“事件”。 在那里你会看到可能派上用场的“loadError”事件。

如果您查看jqgrid演示站点并查看“3.2版中的新function”,应该有一个关于控制服务器错误的部分。

具体来说,它使用回调参数loadError:

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

正如上面的mcv所述,一些错误是数据错误,因此您需要专门处理这些错误。

使用回调。 如果您收到实际的http错误(例如400或500),则会触发loadError(xhr,status,error)。

但是一些错误(如validation)不应该抛出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) } 

从我看到的,它将数据作为json字符串返回。 所以你需要做的是添加一个error handling程序,将错误格式化为json字符串并将其打印为一个。 这可以在php中完成

 set_error_handler 

function。

然后我猜error handling程序将数据推送到jsonReturn.error,因此您只需要在将数据添加到表时检查它。

如果你抛出exception而不是让它一直到错误(可能是更好的做法),那么你会希望将exception格式化为json字符串。

由于它以xml格式返回数据,因此您需要解析xml:

   error message   

像这样:

 $(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相关的错误。 您应该通过try ... catchWeb方法中捕获错误,然后使用return JsonString在catch块中以JSON格式传递它。 然后可以在loadComplete事件中处理它:

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

上述function具有以下含义,根据需要实现:

  • isErrorJson(data) :如果数据对象包含Web方法中定义的错误,则返回true
  • getJsonError(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) }, 

最后它确实使用了我认为的相同方法。

谢谢大家