FromQuery ModelBinding失败,FromBody工作

时间:2016-11-09 21:42:18

标签: c# datatables asp.net-core asp.net-core-mvc

我使用一组标准类将服务器端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对象会正确绑定,但没有子项(DataTableColumnDataTableSearchDataTableOrder)绑定。

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请求相同,只是模型绑定器不起作用。

0 个答案:

没有答案