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

2021/01/31 15:11 · jquery ·  · 0评论

我有一个运行良好的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方法中定义的错误,则返回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) },

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

谢谢大家

本文地址:http://jquery.askforanswer.com/ruhehuodejqgridshibiefuwuqifasongdecuowu.html
文章标签: ,   ,  
版权声明:本文为原创文章,版权归 admin 所有,欢迎分享本文,转载请保留出处!

文件下载

老薛主机终身7折优惠码boke112

上一篇:
下一篇:

评论已关闭!