首页 > 解决方案 > 将数据发布到 WebApi 时,DataTables.AspNet IDataTablesRequest 为空

问题描述

我正在处理DataTables.AspNetnuget 包来实现服务器端分页、搜索和过滤。

我正在尝试将我的表名从 ajax 发布datatables到 WebApi 控制器,以便将特定的 C# DataTable 作为数据源返回。我将表名打包为IDictionary<string, object> AdditionalParameters"table"是键)的键值对。当请求通过DataWebApi 控制器的方法处理时,IDataTablesRequest参数总是来,null所以我无法得到我的表名!此外,当我明确分配表名并 getDataTable时,DataTablesResponse.Create()返回null.

那么如何强制IDataTablesRequest获取从中传递的数据datatables.js

客户端

function loadTable(type, editable) {
var url = "/api/Request/" + type;
$.ajax({
    url: "/api/Request/Columns/" + type,
    type: "GET",
    statusCode: {
        200: function (response) {
            dtcolumns = response;
            var columns = [];
            if (editable) { columns.push({ data: null, className: 'select-checkbox', defaultContent: '' }); }
            for (var i in dtcolumns) {
                columns.push(
                    {
                        name: dtcolumns[i].Name,
                        title: dtcolumns[i].Caption,
                        data: dtcolumns[i].Name,
                        visible: !(dtcolumns[i].Caption === ""),
                        sortable: true,
                        searchable: true
                    });
            }
            var request_data = new Object();
            var AdditionalParameters = {};
            AdditionalParameters["table"] = type; // Table Name!
            request_data.AdditionalParameters = AdditionalParameters;
            var table = $('#just-table').DataTable({
                deferRender: true,
                bPaginate: true,
                autoFill: {
                    horizontal: false
                },
                serverSide: true,
                processing: true,
                columns: columns,
                ajax: {
                    url: "/api/Request/Data",
                    type: "POST",
                    //contentType: "application/json",
                    //dataType: "json",
                    //data: JSON.stringify(request_data),
                    data: request_data, //PASSING TABLE NAME TO WEBAPI CONTROLLER
                    statusCode: {
                        500: function (response) {
                                alert(response.responseJSON.Message)
                        }
                    }
                },
                rowId: 'ID',
                scroller: {
                    loadingIndicator: true
                },
                targets: 0,
                dom: 'BS<"toolbar">frtips'
            });
        }
    }
})
}

服务器端

    [HttpPost]
    [Route("api/Request/Data")]
    public JsonResult<IDataTablesResponse> Data(IDataTablesRequest request /*ALWAYS NULL!!!*/)
    {
        DataTable data = DBContext.GetInstance()[request.AdditionalParameters["table"].ToString()];
        var filteredData = data.AsEnumerable().Where(row => row.ItemArray.Contains(request.Search.Value));
        var dataPage = filteredData.Skip(request.Start).Take(request.Length).CopyToDataTable();
        //ALWAYS NULL!!!
        var response = DataTables.AspNet.WebApi2.DataTablesResponse.Create(request, data.AsDataView().Count, filteredData.Count(), dataPage);
       return new DataTablesJsonResult(response, Request);
    }

标签: c#asp.netajaxasp.net-web-apidatatables

解决方案


您的 ajax 查询是 GET 但该方法装饰有 POST 属性


推荐阅读