2

我是 MVC 和 Jquery 的新手。我目前正在使用来自 jquery 的数据表插件来填充我的应用程序中的表。我的问题是当应用程序第一次加载时,sAjaxSource用于指定从中加载数据的 url(返回 JSON 对象)。

我的问题是我在加载数据时几乎没有要捕获的自定义异常。但我不确定如何使用 JSON 将其作为错误传递,以及我们在客户端哪里捕获错误。在填充数据表时,我没有找到任何指定 ajax 调用成功或错误结果的选项。我的参考链接是http://www.datatables.net/ref#sDom

4

2 回答 2

1

Datatables 有一个用于"ajax"( reference ) 的选项。您可以将字符串、对象或函数传递给此选项。如果传入一个函数,则可以控制来自 AJAX 请求的“错误”响应。这样您就不必看到丑陋的错误消息"DataTables warning: table id Ajax error"

而不是使用此选项构造数据表:

            ajax: {
                url: uri,
                dataSrc: "",
            },

你可以用一个函数来做到这一点:

            /* Datatable options */
            ajax: function(data, callback, settings) {
                datatableAjaxRequest(callback, uri);
            },

/* later on... */
var datatableAjaxRequest = function(callback, uri) {
    $.get(uri)
        .done(function(result) {
            /* result is an array, so I wrap it with an object with attribute "data". */
            callback({ data: result });
        })
        .fail(function(result) {
            console.log(result);
            $('#error-message').html("Could not load the table.");
            $('#error-modal').modal();
        });
};

您可以通过弄乱uri变量来强制执行 404 来轻松测试这一点。

编辑:

使用此选项会导致datatable.ajax.url(newuri).load()失败。它不再使用您的函数,而是再次调用内部方法。解决方法:调用datatable.ajax.reload()并设置/重置方法内的 uri datatableAjaxRequest

于 2014-06-13T18:44:03.547 回答
1

看来您需要使用fnServerData回调。我自己从未使用过它,但您似乎可以手动执行 ajax 请求并捕获您想要的任何服务器端错误。

在你的情况下,它会是这样的:

$(document).ready( function() {
    try {
        $('#example').dataTable( {
        "bProcessing": true,
        "bServerSide": true,
        "sAjaxSource": "xhr.php",
        "fnServerData": function ( sSource, aoData, fnCallback, oSettings ) {
          oSettings.jqXHR = $.ajax( {

            "dataType": 'json', 

            "type": "POST", 

            "url": sSource, 

            "data": aoData, 

            "success": function(response) {
                 //do error checking here, maybe "throw new Error('Some error')" based on data;
                 fnCallback(arguments);
            },

            "error": function() { //404 errors and the like wil fall here
                //"throw new Error('Some error')"
            }
          } );
        }
        } );
    } catch (e) {
        console.error(e);
    }
} );

同样,我以前从未使用过该回调,但从参考资料来看,它似乎是正确的方法。

好吧,这就是如何在客户端捕获错误的部分。至于在出现错误时发送什么,这取决于您的语言和框架。如果你的项目很重要,并且你做了很多这样的 ajax 请求,我建议你构建一个REST API 来获取你的数据。

或者您可以在服务器端捕获错误并返回如下 json:

{
   returnStatus: "error",
   message: "message"
}

当请求成功时,只需返回如下内容:

{
   returnStatus: "success",
   data: [...]
}

只需检查 ajax“成功”回调的 returnStatus 即可。

于 2013-09-09T17:27:28.700 回答