Я видел этот вопрос: Ошибка Jatery Datatables: недопустимый примитив JSON: draw

Это не могло помочь мне решить проблему.

Я использую Datatables, я получаю сообщение об ошибке для вызова AJAX. Вот код JS:

function loadparttrackings() { // Call the datatable on the overview div and link back to server side $('#overviewFilteredPartTrackings').DataTable({ "processing": true, "serverSide": true, "filter": true, "orderMulti": false, "ajax": { "url": window.applicationPath   "/Launches/GetFilteredPartTrackingRecords", "type": "POST", "data": function (d) { d.partNumber = $('#FilterPartNumber').val(); d.segment = $('#FilterSegment').val(); d.commodity = $('#FilterCommodity').val(); } }, // This is needed to hide the ID field and make it not searchable "columnDefs": [{ "targets": [1], "visible": false, "searchable": false }], "columns": [ { "render": function (data, type, full, meta) { return '{amp}lt;a class="btn btn-info" href="#" onclick=EditRecord("'   row.ID   '"); {amp}gt;Edit{amp}lt;/a{amp}gt;'; } }, // more columns omitted }); } 

Проблема возникла, когда я добавил "type": "POST", в часть функции AJAX. Теперь я получаю ошибку invalid json primitive draw .

Вот код для метода контроллера:

 [HttpPost] public ActionResult GetFilteredPartTrackingRecords(DataTableAjaxPostModel model, string partNumber, string commodity, string segment) { // Getting the data and such return Json(new { // this is what datatables wants sending back draw = model.draw, recordsTotal = 1000, // TODO CHANGE recordsFiltered = 1000, // TODO CHANGE data = result }); } 

И вот код для модели, которую я использую:

 public class DataTableAjaxPostModel { // properties are not capital due to json mapping public int draw { get; set; } public int start { get; set; } public int length { get; set; } public List{amp}lt;Column{amp}gt; columns { get; set; } public Search search { get; set; } public List{amp}lt;Order{amp}gt; order { get; set; } } public class Column { public string data { get; set; } public string name { get; set; } public bool searchable { get; set; } public bool orderable { get; set; } public Search search { get; set; } } public class Search { public string value { get; set; } public string regex { get; set; } } public class Order { public int column { get; set; } public string dir { get; set; } } 

Попробуй это

 "data":JSON.stringify({ partNumber: $('#FilterPartNumber').val(); segment: $('#FilterSegment').val(); commodity: $('#FilterCommodity').val(); }) 

И добавьте contentType: "application/json; charset=UTF-8" в опциях ajax.

Я исправил это, выполнив следующее:

удалите тип: post из вызова ajax.

 "ajax": { "url": window.applicationPath   "/Launches/GetFilteredPartTrackingRecords", "data": function (d) { d.partNumber = $('#FilterPartNumber').val(); d.segment = $('#FilterSegment').val(); d.commodity = $('#FilterCommodity').val(); } }, 

Измените метод контроллера, чтобы получить

 [HttpGet] public ActionResult GetFilteredPartTrackingRecords(DataTableAjaxPostModel model, string partNumber, string commodity, string segment) 

Измените поведение запроса JSON, чтобы я мог вернуться через GET

 return Json(new { // this is what datatables wants sending back draw = model.draw, recordsTotal = 1000, // TODO CHANGE recordsFiltered = 1000, // TODO CHANGE data = result }, JsonRequestBehavior.AllowGet); 

Я не знаю, является ли это лучшим / хорошим решением, но это работает для меня.