JQuery 使用附加变量的 DataTables 服务器端处理

JQuery DataTables serverside processing with additional variables

我一直在尝试使用 JQuery 数据表和服务器端处理来实现显示日志的解决方案。这在很大程度上是成功的。数据表声明如下:

$('#IndexTable').dataTable({
    "bServerSide": true,
    "oLanguage": {
    "sSearch": "<div class='editor-label-wide float-left'>" +
        "Search : " +
            "</div>" +
            "<div class='editor-field float-left'>" +
                "_INPUT_" +
            "</div>" +
            "<div class='clear-left'>" +
                "<br/>" +
            "</div>",
        "sLengthMenu": "<div class='editor-label-wide float-left'>" +
                      "Display : " +
            "</div>" +
            "<div class='editor-field float-left'>" +
                "_MENU_" +
            "</div>" +
            "<div class='clear-left'>" +
                "<br/>" +
            "</div>",
        "sInfo": "<br/>Showing _START_ to _END_ of _TOTAL_ records",
},
"bDestroy": true,
"sAjaxSource": '@Url.Action("List")',
"fnServerData": function (sSource, aoData, fnCallback) {
    $.ajax({
        dataType: 'json',
        type: "POST",
        url: sSource,
        data: aoData,
        success: fnCallback,
        error: function (jqXHR, textStatus, errorThrown) { alert('Error getting logs:' + errorThrown) }
    })
},
"bPaginate": true,
"sPaginationType": "full_numbers",
"iDisplayLength": 25,
"aLengthMenu": [[10, 25, 50, 100], [10, 25, 50, 100]],
"aoColumnDefs": [
    { "sName": "Level", "aTargets": [0], "mDataProp": "LogLevel" },
    { "sName": "Source", "aTargets": [1], "mDataProp": "LogSource" },
    { "sName": "Date", "aTargets": [2], "mDataProp": "LogDate" },
    { "sName": "Text", "aTargets": [3], "mDataProp": "LogText" }
    ]
});

然后,控制器动作:

public JsonResult List(jQueryDataTableParamModel param)
{ ... }

其中 jQueryDataTableParamModel 的结构如 here 所示。

这非常适合显示、分页、搜索和排序。问题是,我有 2 个 drop-downs,当我仍然进行处理时使用 client-side,它根据 2 个列(级别和源)过滤所有内容:

为此,我需要在 List 操作方法中选择值。我试图通过简单地在方法中添加参数并传递它们来做到这一点。

data: {
    param: aoData,
    levelId: $("#LevelList").val(),
    sourceId: $("#SourceList").val()
},

这样做是可行的,但是 jQueryDataTableParamModel 中的所有字段都是 null:

我只能假设问题在于以下两者之间的差异:

data: aoData

data: {
    param: aoData
},

在 ajax 调用中。

我通过执行以下操作解决了这个问题:

"ajax": {
    "url": "@Url.Action("List")",
    "type": "POST",
    'contentType': 'application/json; charset=utf-8',
    'data': function (data) {
        var tempData = {};
        tempData.pageRequest = data;

        // To addd custom parameters:
        // tempData.customParameter1 = $("#CustomParam").val()

        tempData.levelId = $("#LevelId").val();
        tempData.sourceId = $("#SourceId").val();

        return JSON.stringify(tempData);
    }
},

然后在控制器操作中收到这些:

public JsonResult List(DataTablesPageRequest pageRequest, int levelId, int sourceId)
{ ... }

注意:我必须将我的 DataTables 版本从 1.9.2 更新到 1.10.5