【问题标题】:Prevent restoring row if error was rised while editing如果在编辑时出现错误,则防止恢复行
【发布时间】:2011-06-07 18:41:00
【问题描述】:
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 ,如何防止恢复行?

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

【问题讨论】:

    标签: jqgrid inline-editing


    【解决方案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 状态和错误描述的响应。此类错误响应将生成您使用的框架(ASP.NET、PHP 等)的 Web 服务器。
    • jqGrid使用的jQuery应该知道哪个服务器响应成功,哪个是错误响应。经常错误响应有另一种格式,所以那里不会被jQuery.ajax解析(jQuery不会将它从JSON字符串转换成对象)。
    • jqGrid 知道响应是否成功很重要。如果 jqGrid 在响应后发生错误,则做一件事,如果响应成功,则做另一件事。将调用不同的事件,将显示不同的消息等等。

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

    【讨论】:

    • 非常感谢!但是为什么不听suc​​cesfunc呢?正如在 afterSubmit 函数中所做的那样: afterSubmit : function(response, postdata){var data = eval('(' + response.responseText + ')'); return [data.result.success,'message',data.result.id] } 例如如果返回 false 则不会运行恢复。
    • 我找到了另一个解决方案。在succesfunct 中总是返回true。 jQuery(this).editRow(rowid,true,null, function(response, postdata){var data = jQuery.parseJSON(response.responseText); alert(data.result.success); return true; });所以不会触发恢复。
    • 谢谢。我了解您对错误处理的立场。但是在 RoR 应用程序中,通常有用于处理服务器错误的全局 js 函数和其他接受 dom 对象和对象验证错误(作为 JSON 中的服务器响应)的函数,用于标记字段(和任何其他参数)。所以在这种情况下,我们应该将验证错误和其他常见的服务器错误(400、500 等)分开。
    • @mihserf:我不使用 RoR,但简单的研究表明,在 2.3 版本之前,您可以使用 response.headers["Status"] 设置 HTTP 状态代码,并从 2.3 版本开始使用 statusstatus_message帮手。以stackoverflow.com/questions/2238244/custom-error-pages-in-rails/… 为例。我主要使用 Microsoft ASP.NET MVC 或 WFC 来构建 RESTfull 服务,并且可以毫无问题地设置自定义 HTTP 错误代码。一般来说,您可以在 RoR 中产生 any 错误并在正文中发送更多信息。在 .NET 中抛出 WebFaultException<string> 异常执行此操作。
    • @mihserf:很快:在服务器上使用哪种技术并不重要。如果服务器使用 HTTP 协议发送结果,您必须根据 HTTP 错误发送错误。所有网络服务器技术都让您有可能做到这一点。
    【解决方案2】:

    我想解决同样的情况,我可以这样做:

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

    在网格模型中:

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

    【讨论】:

      猜你喜欢
      • 2019-09-19
      • 1970-01-01
      • 1970-01-01
      • 2018-09-21
      • 2018-07-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多