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

时间:2011-08-05 17:23:23

标签: javascript jquery jqgrid

在我的json回复中,我有'STATUS'和'errors'属性。 如何在jqGRid中使用此错误属性。解析所有错误并在对话框中显示它们。

基本上只需检查,如果状态:'ERROR'则显示所有错误。

谢谢!

3 个答案:

答案 0 :(得分:14)

在前一个问题the answer的最后一部分,我尝试过尝试就当前问题给出答案。可能我表达的不够清楚。

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

网格中的加载数据,行的编辑以及与服务器的所有Ajax通信都是根据HTTP协议实现的。每个HTTP响应在响应的第一行中都有状态码。了解其含义非常重要。

使用JSON数据的典型成功请求如下所示

HTTP/1.1 200 OK
...
Content-Type: application/json
...

{"page":"1",....}

如果尝试加载的URL不存在,例如服务器响应的第一行将是

HTTP/1.1 404 Not Found

和jqGrid 基于HTTP状态代码(在这种情况下为404)*不会尝试将服务器响应解释为包含网格内容数据的数据。

The demo包含以下代码

$("#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);
    }
});

显示如下警告消息:

enter image description here

此外,在jqXHR.responseText中,您会发现服务器响应的完整正文和字符串一样。下一个警报显示响应。

通过以上所有信息,我想向您展示错误响应和成功响应将由您使用的整个软件堆栈以另一种方式处理(jqGrid,jQuery,XMLHttpRequest object,...)。因此,如果检测到错误,您应该在服务器响应中使用error HTTP status codes。例如,在the answer中,您将看到如何在使用ASP.NET MVC时执行此操作。

Here你可以找到另一个版本的loadError实现,它等待JSON格式的输入:{"Source":"some error source",Message:"Description of the error"},错误输出就像这里

enter image description here

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

enter image description here

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

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>';
    };

更新Free jqGrid包含loadError默认实施(请参阅herehere),在Ajax错误最多的情况下,相对可读的错误消息。它在错误div中显示结果文本,该文本存在于网格主体的上方。因此,建议在使用自定义loadError之前测试默认行为是否产生良好结果。如果您确实需要创建自己的loadError,那么可以使用免费jqGrid的displayErrorMessage方法将错误消息放入错误div中:$("#grid").jqGrid("displayErrorMessage", customErrorMessage);

答案 1 :(得分:1)

前段时间我正在寻找类似的问题并碰到了answer。 阅读Oleg的回答。他是jqgrid人; - )

答案 2 :(得分:0)

要执行您所描述的操作,最简单的方法是向 jqgrid 从服务器检索的 data json 对象添加自定义属性。然后,您可以使用 loadComplete(data) 事件捕获这些自定义属性。

jQuery('#grid').jqGrid({
    loadComplete: function (data) {
        //access data.propertyname here
    }
});