2009-10-28 77 views

回答

7

我:

$(request.responseXML).find("error").each(function() { 
     var error = $(this); 
     //do something with the error 
}); 

从耍赖借最近在我为CB Richard Ellis(我的雇主)工作的原型项目中广泛使用了jqgrid。如documentation所述,有很多方法可以填充jqgrid:(请参阅“检索数据”节点)。

目前我做一个服务调用返回评估当一个JSON字符串,给我一个包含以下对象:

  • COLUMNNAMES:字符串[]
  • ColumnModels:[对象](每个对象具有属性“名称”,“索引”和“排序”)
  • 数据:对象[](每个对象具有在列模型匹配的名称即属性)
  • TotalRows:整数

在我的成功回调中,我手动创建了如下所示的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]); 

所以你可以看到我手动填充数据。有超过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]); 
} 

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

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

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

+0

嘿山姆...如果你还没有看到它.. http://skysanders.net/code/jQGridWS/default.aspx 你可能可以重用一些它,也许添加一些例外处理能力。 – 2010-02-05 06:42:33

1

从我看到的情况来看,它将数据作为json字符串返回。所以你必须做的是添加一个错误处理程序,将错误的格式设置为json字符串并将其打印为一个。这可以在php中用

set_error_handler 

函数。

错误处理程序然后我会推动数据到jsonReturn.error,所以你只需要检查,当你将数据添加到表。

如果你抛出异常而不是让它一路发生错误(可能是一种更好的做法),那么你会想要将异常格式化为json字符串。

,因为它是一个XML格式返回数据,你会想解析XML:

<xml> 
    <error> 
     error message 
    </error> 
</xml> 

这样的:http://marcgrabanski.com/article/jquery-makes-parsing-xml-easy

+0

否服务器以XML格式返回数据!任何解决方案 – ZeroCool 2009-10-28 13:04:37

3

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

但是,一些错误(如验证)不应该抛出400或500错误。但是你仍然可以在loadComplete(xhr)中捕获它们。解析你的json,并检查你用什么方式来识别错误。如果你看一下jqgrid demo site,并期待在“什么是在3.2版本的新”应该有一个关于控制服务器错误部分

if (jsonResponse.errors) { $.each(jsonResponse.errors, function(i, val){ addErrorMessage($("#"+val.field), val.message); }); }

+0

谢谢!这正是我需要的! – 2014-03-06 16:51:46

19

:例如,我在我的loadComplete()这样做。

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

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

正如上面MCV指出,一些错误的数据错误,所以你需要专门处理这些。

+3

+1这是我在Google搜索后发现此问题时所寻找的内容。我想要捕获用于获取数据的URL中发生的内部500错误。 – 2012-12-07 20:17:48

+1

这是实际的答案。 – 2014-03-10 17:56:42

+0

@ r00fus感谢您的回应。这真的很有帮助:D – Harshit 2015-10-05 06:56:42

0
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) }, 

在它使用同样的方法,我认为结束。

感谢所有

2

您可以使用jqGrid的定义loadError事件(见documentation)。例如:

//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) 
    } 
1

另一件事要记住/或我发现是,如果你正在使用Asp.net你需要把

的部分 - 这将让你反思回来的消息好。

1

如果您使用的jqGrid与选项

  ajaxGridOptions: { contentType: 'application/json; charset=utf-8' }, 
      datatype: "json", 
      url: wsPath 

通过AJAX和Web服务或MVC控制器来加载数据,那么这个答案是给你的。

注意如果在处理AJAX调用的web方法中发生运行时错误,它不能通过loadError捕获,因为loadError只捕获HTTP相关的错误。您应该更倾向于通过try ... catch网络方法中发现错误,然后使用return JsonString在catch块中以JSON格式传递它。然后,它可以在loadComplete事件的处理方式:以上

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

的功能具有以下含义,根据需要执行这些:

  • isErrorJson(data):返回true,如果数据对象包含如在定义的错误您的网络方法
  • getJsonError(data):返回网络方法中定义的错误消息的字符串
  • ShowErrorDialog(msg):在屏幕上显示错误消息,例如通过jQueryUI对话框。

在Web服务方法,您可以使用JavaScriptSerializer创建这样一个错误的对象,为2种JavaScript方法上面,你可以使用jQuery函数$.parseJSON(data.d)得到消息出来的JSON对象。

相关问题