解决方法
您不应该将错误信息放在标准成功响应中.您应该遵循用于服务器和客户端之间通信的HTTP协议的主要规则.
根据HTTP协议实现网格中的加载数据,编辑行和与服务器的所有Ajax通信.每个HTTP响应都有响应第一行的状态代码.了解这个意义非常重要.
典型的JSON数据成功请求如下
HTTP/1.1 200 OK ... Content-Type: application/json ... {"page":"1",....}
如果尝试加载的URL不存在,例如服务器响应的第一行将是
HTTP/1.1 404 Not Found
和基于HTTP状态代码(在这种情况下为404)的jqGrid *将不会尝试将服务器响应解释为包含具有网格内容的数据的数据.
$("#list").jqGrid({ url: 'Unknown.json',// there are no file with the name datatype: 'json',// ... some other typical parameters loadComplete: function () { alert("OK"); },loadError: function (jqXHR,textStatus,errorThrown) { alert('HTTP status code: ' + jqXHR.status + '\n' + 'textStatus: ' + textStatus + '\n' + 'errorThrown: ' + errorThrown); alert('HTTP message body (jqXHR.responseText): ' + '\n' + jqXHR.responseText); } });
显示警报消息,如下所示:
此外,在jqXHR.responseText中,您会发现服务器响应的全部内容与字符串一样.下一个警报显示响应.
通过上述所有信息,我想向您展示错误响应和成功响应将以您使用的整个软件堆栈(jqGrid,jQuery,XMLHttpRequest对象,…)以其他方式处理.所以你应该在服务器响应中使用error HTTP status codes,如果检测到错误.例如,在the answer中,如果使用ASP.NET MVC,您将看到如何执行此操作.
Here你可以找到另一个版本的loadError实现,等待JSON格式的输入:{“Source”:“一些错误源”,消息:“错误描述”},错误输出将如下所示
loadComplete: function () { // remove error div if exist $('#' + this.id + '_err').remove(); },errorThrown) { // remove error div if exist $('#' + this.id + '_err').remove(); // insert div with the error description before the grid $(this).closest('div.ui-jqgrid').before( '<div id="' + this.id + '_err" style="max-width:' + this.style.width + ';"><div class="ui-state-error ui-corner-all" style="padding:0.7em;float:left;">' + decodeErrorMessage(jqXHR,errorThrown) + '</div><div style="clear:left"/></div>' ); }
其中decodeErrorMessage函数定义为
var decodeErrorMessage = function (jqXHR,errorThrown) { var htmlBody,errorInfo,i,errorText = '',errorIconSpan = '<span class="ui-icon ui-icon-alert" style="float:left; display: inline-block; margin-right: .3em;"></span>'; if (textStatus) { errorText = textStatus; } if (errorThrown) { if (errorText.length > 0) { errorText += '<hr/>'; } errorText += errorThrown; } if (typeof (jqXHR.responseText) === "string") { if (jqXHR.responseText.charAt(0) === '[') { try { errorInfo = $.parseJSON(jqXHR.responseText); errorText = ""; for (i = 0; i < errorInfo.length; i += 1) { if (errorText.length !== 0) { errorText += "<hr/>"; } errorText += errorInfo[i].Source + ": " + errorInfo[i].Message; } } catch (e) { } errorText = errorIconSpan + errorText; } else { htmlBody = /<body.*?>([\s\S]*)<\/body>/i.exec(jqXHR.responseText); if (htmlBody !== null && htmlBody.length > 1) { errorText = htmlBody[1]; } } } else { errorText = errorIconSpan + errorText; } return '<div style="float:left">' + errorText + '</div>'; };
更新:Free jqGrid包含loadError(见here和here)的默认实现,它在大多数Ajax错误的情况下生成相对可读的错误消息.它将生成的文本显示在网格正文之上的错误div中.因此,建议测试,在使用自定义loadError之前,默认行为是否产生良好的结果.如果您真的需要创建自己的loadError,那么可以使用免费jqGrid的displayErrorMessage方法将错误消息放在错误div中:$(“#grid”).jqGrid(“displayErrorMessage”,customErrorMessage);