Проблема с данными из-за недопустимого примитива JSON - PullRequest
0 голосов
/ 27 мая 2019

Я видел этот вопрос: Ошибка 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 '<a class="btn btn-info" href="#" onclick=EditRecord("' + row.ID + '"); >Edit</a>'; }
            },
            // 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<Column> columns { get; set; }
    public Search search { get; set; }
    public List<Order> 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; }
}

Ответы [ 2 ]

0 голосов
/ 27 мая 2019

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

удалить тип: 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);

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

0 голосов
/ 27 мая 2019

Попробуйте это

"data":JSON.stringify({

            partNumber: $('#FilterPartNumber').val();
            segment: $('#FilterSegment').val();
            commodity: $('#FilterCommodity').val();
   })

И добавьте параметры contentType: "application/json; charset=UTF-8" в ajax.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...