将数据发布到 WebApi 时,DataTables.AspNet IDataTablesRequest 为空

Posted

技术标签:

【中文标题】将数据发布到 WebApi 时,DataTables.AspNet IDataTablesRequest 为空【英文标题】:DataTables.AspNet IDataTablesRequest is null when posting data to WebApi 【发布时间】:2020-03-23 08:01:48 【问题描述】:

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

我正在尝试将我的表名从 ajax datatables 发布到 WebApi 控制器,以便将特定的 C# DataTable 作为数据源返回。我将表名打包为 IDictionary<string, object> AdditionalParameters 的键值对("table" 是键)。当请求由 WebApi 控制器的Data 方法处理时,IDataTablesRequest 参数总是以null 的形式出现,所以我无法获得我的表名!此外,当我显式分配表名并获取DataTable 时,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);
    

【问题讨论】:

如果你不传递任何额外的参数(通过注释掉这一行data: request_datarequest 对象是否仍然为空? @zgood 不幸的是:( 【参考方案1】:

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

【讨论】:

不!这个请求是 POST(查看“/api/Request/Data”)

以上是关于将数据发布到 WebApi 时,DataTables.AspNet IDataTablesRequest 为空的主要内容,如果未能解决你的问题,请参考以下文章

将数据发布到 WebApi 时,DataTables.AspNet IDataTablesRequest 为空

使用 DataTable 将数据加载到 DataGridView 的进度条

将 JSON 数据显示到 DataTable Flutter

选择 webApi 模板时如何将 ASP.Net 身份添加到 Asp.Net Core?

映射如何通过 .NET 中的 DataReader 通过 Load() 将数据读取到 DataTable?

将正确的标头值发送到从角度 $http 到 asp.net webapi 的 Preflight 请求时出错