【发布时间】: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_data)request对象是否仍然为空? -
@zgood 不幸的是:(
标签: c# asp.net ajax asp.net-web-api datatables