jqgrid服务器端错误消息/validation处理

在我的JSON响应中,我有“状态”和“错误”属性。 如何使用这个错误属性与jqGRid。 parsing所有错误并在对话框中显示它们。

基本上只是检查,如果状态:'错误'然后显示所有错误。

谢谢!

在你对上一个问题的回答的最后一部分,我已经试着对你当前的问题给出答案。 可能我expression得不够清楚。

您不应该在标准的成功响应中放置错误信息。 您应该遵循用于服务器和客户端之间通信的HTTP协议的主要规则。

在网格中加载数据,对行进行编辑以及与服务器进行的所有Ajax通信都是根据HTTP协议来实现的。 每个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你会发现服务器响应的完整体例如string。 下一个警报显示响应。

有了以上所有的信息,我想告诉你错误响应和成功的响应将以另一种方式由你使用的整个软件堆栈(jqGrid,jQuery, XMLHttpRequest对象,…)来处理。 所以你应该只在服务器响应中使用错误的HTTP状态码 ,如果错误将被检测到。 在答案例如,你会看到如何使用ASP.NET MVC的情况下做到这一点。

在这里你可以find另一个版本的loadError实现,它以JSON的forms等待input: {"Source":"some error source",Message:"Description of the error"} ,错误输出就像这里

在这里输入图像描述

但代码可以额外显示由您的Web服务器生成的HTML响应:

在这里输入图像描述

您可以轻松修改代码以达到您的目的。 代码你可以在下面find

 loadComplete: function () { // remove error div if exist $('#' + this.id + '_err').remove(); }, loadError: function (jqXHR, textStatus, 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, textStatus, errorThrown) + '</div><div style="clear:left"/></div>' ); } 

其中decodeErrorMessage函数定义为

 var decodeErrorMessage = function (jqXHR, textStatus, 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>'; }; 

更新 : 免费的jqGrid包含loadError (见这里和这里 )的默认实现 ,这将生成相对可读的错误消息,以防大多数Ajax错误。 它显示错误div中的结果文本,位于网格正文的上方。 因此,build议在使用自定义loadError之前testing默认行为是否产生良好结果。 如果你真的需要创build自己的loadError那么你可以使用displayErrorMessage方法免费jqGrid: $("#grid").jqGrid("displayErrorMessage", customErrorMessage);

前段时间我正在寻找一个类似的问题,并碰到这个答案 。 阅读奥列格的答案。 他是jqgrid的人;-)