我使用一组标准类将服务器端DataTables.net网格绑定到数据源。
public class DataTable
{
// Grid properties
public int draw { get; set; }
public List<DataTableColumn> columns { get; set; }
public List<DataTableOrder> order { get; set; }
public int start { get; set; }
public int length { get; set; }
public DataTableColumnSearch search { get; set; }
}
public class DataTableColumn
{
public string data { get; set; }
public string name { get; set; }
public bool searchable { get; set; }
public bool orderable { get; set; }
public DataTableColumnSearch search { get; set; }
}
public class DataTableColumnSearch
{
public string value { get; set; }
public bool regex { get; set; }
}
public class DataTableOrder
{
public int column { get; set; }
public string dir { get; set; }
}
public class Grid
{
public int start { get; set; }
public int recordsFiltered { get; set; }
public int recordsTotal { get; set; }
public object data { get; set; }
public void Setup<T>(IQueryable<T> r, DataTable p)
{
// Filter, sort and bind the data data to this.data
}
}
然后,在MVC 5中,我能够使用QueryString
模型绑定:
public async Task<JsonResult> GetDataTable(DataTable p)
一切都已绑定,列,搜索和订单对象都已设置。
我正在.NET Core中设置一个新项目,现在只有在您接受[HttpPost]
并将DataTables.net请求发布到控制器时才会有效。
如果我使用[HttpGet]
方法,则DataTable
对象会正确绑定,但没有子项(DataTableColumn
,DataTableSearch
或DataTableOrder
)绑定。
Form Data和QueryString数据相同:
draw:1
columns[0][data]:Col1
columns[0][name]:
columns[0][searchable]:true
columns[0][orderable]:true
columns[0][search][value]:
columns[0][search][regex]:false
columns[1][data]:Col2
columns[1][name]:
columns[1][searchable]:true
columns[1][orderable]:true
columns[1][search][value]:
columns[1][search][regex]:false
order[0][column]:0
order[0][dir]:asc
start:0
length:10
search[value]:v6
search[regex]:false
我更喜欢使用GET
请求,因为它正在获取数据,因此不需要发布。如上所述,这在MVC 5中有效,所以我不确定发生了什么变化?
编辑添加
根据评论,它只是使用标准模型绑定器:
public class OutboundCaims: Controller
{
//[HttpGet]
[HttpPost]
[Route("Claims")]
public async Task<JsonResult> GetClaims(DataTable p) { }
}
如果使用POST,DataTable类由模型绑定器正确绑定,而使用GET则不是。在Chrome开发工具中查看时,POST和GET都会产生与上面相同的输出,所以非常确定不是这样。
请求是使用DataTables.net内置的标准jQuery ajax请求集进行的。
使用GET
方法修改添加:请求网址:
http://localhost:55319/api/DataTable?draw=1&columns%5B0%5D%5Bdata%5D=col1&columns%5B0%5D%5Bname%5D=&columns%5B0%5D%5Bsearchable%5D=true&columns%5B0%5D%5Borderable%5D=true&columns%5B0%5D%5Bsearch%5D%5Bvalue%5D=&columns%5B0%5D%5Bsearch%5D%5Bregex%5D=false&columns%5B1%5D%5Bdata%5D=col2&columns%5B1%5D%5Bname%5D=&columns%5B1%5D%5Bsearchable%5D=true&columns%5B1%5D%5Borderable%5D=true&columns%5B1%5D%5Bsearch%5D%5Bvalue%5D=&columns%5B1%5D%5Bsearch%5D%5Bregex%5D=false&columns%5B2%5D%5Bdata%5D=contract&columns%5B2%5D%5Bname%5D=&columns%5B2%5D%5Bsearchable%5D=true&columns%5B2%5D%5Borderable%5D=true&columns%5B2%5D%5Bsearch%5D%5Bvalue%5D=&columns%5B2%5D%5Bsearch%5D%5Bregex%5D=false&columns%5B3%5D%5Bdata%5D=manufacturer&columns%5B3%5D%5Bname%5D=&columns%5B3%5D%5Bsearchable%5D=true&columns%5B3%5D%5Borderable%5D=true&columns%5B3%5D%5Bsearch%5D%5Bvalue%5D=&columns%5B3%5D%5Bsearch%5D%5Bregex%5D=false&columns%5B4%5D%5Bdata%5D=owner&columns%5B4%5D%5Bname%5D=&columns%5B4%5D%5Bsearchable%5D=true&columns%5B4%5D%5Borderable%5D=true&columns%5B4%5D%5Bsearch%5D%5Bvalue%5D=&columns%5B4%5D%5Bsearch%5D%5Bregex%5D=false&order%5B0%5D%5Bcolumn%5D=0&order%5B0%5D%5Bdir%5D=asc&start=0&length=10&search%5Bvalue%5D=&search%5Bregex%5D=false&_=1478804216098
这映射到与POST请求相同,只是模型绑定器不起作用。