【问题标题】:Using jQuery DataTables plug-in in MVC3 with jQuery Ajax使用 jQuery Ajax 在 MVC3 中使用 jQuery DataTables 插件
【发布时间】:2011-10-21 14:58:42
【问题描述】:

我正在尝试使用 MVC3 中的 DataTables jQuery 插件,使用 ajax 请求作为表的数据源。

我有一个名为“搜索”的视图,其中包含一个搜索表单...在表单下,我有以下 html...

<table id="caseTable" class="clear full-width dataTable">    
    <thead>
        <tr>
            <th>Case Name</th>
            <th>Court</th>
            <th>Case Number</th>
            <th>Case Filed Date</th>
            <th>Chapter</th>
            <th>Last Researched</th>
            <th>Disposition</th>
        </tr>
    </thead>
    <tbody>
    </tbody>
</table>

当提交搜索表单时,会发送一个 ajax 调用来获取要在表中显示的每条记录的 tr 元素。

$.ajax({
    url: "/Home/SearchForCases",
    type: "POST",
    data: {
        CaseNumber: caseNumber,
        DebtorLastName: lastName,
        Last4SSN: last4SSN,
        FullSSN: fullSSN,
        StartDate: $("#StartDate").val(),
        EndDate: $("#EndDate").val(),
        SelectedCourtDistrictId: $("#SelectedCourtDistrictId").val(),
        SelectedChapterId: $("#SelectedChapterId").val()
    },
    success: function (result) {
        $("#caseTable > tbody").html(result);
        $("#caseTable").dataTable({
            "bDestroy": true,
            "bJQueryUI": true,
            "sPaginationType": "full_numbers",
            "asStripClasses": ["white-highlight"],
            "bAutoWidth": false
        });
        $("#caseTable > tbody > tr").dblclick(function () {
            $(this).removeClass("white-highlight").addClass("yellow-highlight");
        });
    },
    complete: function () {
        $("#ajaxProgress").dialog('close');
        $("#searchResults").show();
    }
});

第一次调用时一切正常,但在随后的调用中,从 ajax 调用返回的数据被追加而不是替换。我检查了从 ajax 调用返回的 html,它总是返回一行数据,仅限 &lt;tr&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;

【问题讨论】:

    标签: asp.net-mvc asp.net-mvc-3 jquery datatables


    【解决方案1】:

    添加 bDestroy 选项以首先删除旧的数据表格式。您也可以尝试删除 bRetrieve 选项。

       success: function (result) {
            $("#caseTable > tbody").html(result);
            $("#caseTable").dataTable({
                "bJQueryUI": true,
                "sPaginationType": "full_numbers",
                "asStripClasses": ["white-highlight"],
    
                "bDestroy": true
            });
    

    编辑

    如果可能,最好更改代码,以便在创建数据表时通过传入sAjaxSource 选项来使用内置的数据表ajax 功能。这将需要您更改服务器端代码以返回数据的 json 而不是 html。

    如果这不可能,那么您应该在添加新数据之前使用fnClearTable 清除现有数据。

    var dataTable;
    
    $.ajax({
    
        ...
    
        success: function (result) {
            // If it has been created, clear the existing data in the datatable
            if(dataTable != null) {
                dataTable.fnClearTable();
            }
    
            // Add your new data
            $("#caseTable > tbody").html(result);
    
            // Create / recreate the datatable
            dataTable = $("#caseTable").dataTable({
                "bDestroy": true,
                "bJQueryUI": true,
                "sPaginationType": "full_numbers",
                "asStripClasses": ["white-highlight"],
                "bAutoWidth": false
            });
    
            $("#caseTable > tbody > tr").dblclick(function () {
                $(this).removeClass("white-highlight").addClass("yellow-highlight");
            });
        },
    
        ...
    });
    

    【讨论】:

    • 感谢您的回复。我尝试添加该选项,但仍然得到相同的结果。
    • 您可以尝试删除 bRetrieve 选项,看看是否有任何作用?
    • 我删除了 bRetrieve 选项,我得到了不同的结果。数据表在后续请求中成功重新绘制,但是行不会延伸到表的整个宽度,后续调用会追加行而不是替换表中当前的内容。
    • 关于如何解决此问题的任何想法?
    • 确保在获取表格元素时在#caseTable 和tbody 之间有一个'>'。我在你的问题中没有看到。还要确保您实际上是从您的 ajax 请求中返回有效的 html。它必须包含 ...... 标签,因为您只是替换 tbody 的 html。
    【解决方案2】:

    尝试在成功回调之外初始化您的数据表,然后在更新表格的 html 后调用fnDraw() 函数来重绘表格。

    编辑

    var dataTable = $("#caseTable").dataTable({
                "bJQueryUI": true,
                "bRetrieve": true,
                "bServerSide": true,
                "sAjaxSource": //Url to hit to query your database and return table data
                "sPaginationType": "full_numbers",
                "asStripClasses": ["white-highlight"]
            });
    
    $("#caseTable tbody tr").dblclick(function () {
                $(this).removeClass("white-highlight").addClass("yellow-highlight");
            });
    
    $.ajax({
        url: "/Home/SearchForCases",
        type: "POST",
        data: {
            CaseNumber: caseNumber,
            DebtorLastName: lastName,
            Last4SSN: last4SSN,
            FullSSN: fullSSN,
            StartDate: $("#StartDate").val(),
            EndDate: $("#EndDate").val(),
            SelectedCourtDistrictId: $("#SelectedCourtDistrictId").val(),
            SelectedChapterId: $("#SelectedChapterId").val()
        },
        success: function () {
            dataTable.fnDraw();
        },
        complete: function () {
            $("#ajaxProgress").dialog('close');
            $("#searchResults").show();
        }
    });
    

    【讨论】:

    • @Kevin - 感谢您的回复。我尝试将初始化移动到脚本文件的顶部,然后在更新 html 后调用 fnDraw() 函数,但它清除了表格。我还尝试在重新加载 html 之前调用它,我得到了数据但没有样式。
    • 你可以重构你的代码以使用服务器端处理吗?
    【解决方案3】:

    抱歉,格式不佳,但只需在您的代码中添加此条件即可。这将确保您的表已经存在,并且您只是从一页转到另一页,然后您的数据将被替换而不是附加。希望这会有所帮助

    if(typeof datataTable !="undefined" && datatable != null)
    { 
        $.ajax({
    
        success: function (result) {
        // If it has been created, clear the existing data in the datatable
        if(dataTable != null) {
            dataTable.fnClearTable();
        }
    
        // Add your new data
        $("#caseTable > tbody").html(result);
    
        // Create / recreate the datatable
        dataTable = $("#caseTable").dataTable({
            "bDestroy": true,
            "bJQueryUI": true,
            "sPaginationType": "full_numbers",
            "asStripClasses": ["white-highlight"],
            "bAutoWidth": false
        });
    
        $("#caseTable > tbody > tr").dblclick(function () {
            $(this).removeClass("white-highlight").addClass("yellow-highlight");
        });
    },
    
    
    });} else{dataTable.fnClearTable(0);dataTable.fnDraw();}
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-31
      • 2019-09-24
      • 1970-01-01
      相关资源
      最近更新 更多