如果在编辑时出现错误,则阻止恢复行

时间:2011-01-12 11:21:04

标签: jqgrid inline-editing

onSelectRow: function(id){
  if(id && id!==lastSel){
    jQuery(this).restoreRow(lastSel);
    lastSel=id;
  }
  jQuery(this).editRow(id,true,null,
                       function(response, postdata){
                           var data = eval('(' + response.responseText + ')');
                           data.result.success ? alert('success') : alert('error')
                       });
}

在这种情况下,我可以处理错误,但在此行数据恢复之后。 问题是如果data.result.success == false

,如何阻止恢复行

如果我通过模态框进行编辑,那么一切正常。但是在内联模式下没有。

2 个答案:

答案 0 :(得分:1)

editRow函数具有以下参数:

jQuery("#grid_id").jqGrid('editRow',rowid, keys, oneditfunc, succesfunc, url,
                          extraparam, aftersavefunc,errorfunc, afterrestorefunc);

您当前的代码仅使用succesfunc。重要的是,服务器返回一些更大或等于400的HTTP status code。然后服务器响应将被jQuery.ajax和jqGrid解释为错误。要显示任何错误消息或出现错误时的任何其他操作,您应使用editRow函数的 errorfunc 参数。

还有一个小小的评论。您应该使用jQuery.parseJSONJSON.parse,而不是使用eval

更新:我在此回答您的评论问题。为什么使用errorfunc而不是succesfunc这一点很重要?有不同的原因。如果你把标有糖的盒子装满了盐,它可能会给你的厨房带来痛苦的后果。在使用错误的情况下,editRow的回调函数完全相同。我只举几个例子:

  • 您的服务器部件不仅可以明确生成错误。您的Web服务器可以从SQL查询等任何其他代码中抛出异常。即使您捕获所有此类错误,发送到具有错误格式或具有其他错误的服务器的输入数据也可以生成具有失败的HTTP状态和错误描述的响应。这样的错误响应将产生您使用的框架的Web服务器(ASP.NET,PHP等)。
  • jqGrid使用的jQuery应该知道哪个服务器响应成功,哪个是错误响应。经常出现错误响应另一种格式,因此jQuery.ajax将不会解析 (jQuery不会将其从JSON字符串转换为对象)。
  • jqGrid知道响应是否成功很重要。如果出现错误,jqGrid会在响应后做一件事,以便在成功响应另一件事情的情况下。将调用不同的事件,将显示不同的消息等等。

我写的关于处理错误的内容是一般规则。 jqGrid在发生错误时定义了许多事件。例如,loadError用于网格填充,errorTextFormat用于所有类型的表单编辑,errorCell用于单元格编辑,errorfunc用于内联编辑。所有方法都基于以下事实:如果出现错误,服务器响应具有与错误相对应的HTTP状态代码(更大或等于400)。

答案 1 :(得分:1)

我想修复相同的场景,我可以这样做:

$.extend($.jgrid.inlineEdit, { restoreAfterError: false });

在网格模型中:

ajaxRowOptions: {
    complete: function(res, stat) {
        if (res.statusText=='OK') {
            return [true, res.responseText ];
        } else {
            return [false, res.responseText ];
        }
    }
}