Ошибка «Неверный тип содержимого» при отправке параметра в формате ajax с датой в ASP.NET Core 2.0 - PullRequest
0 голосов
/ 08 декабря 2018

Я получаю данные таблицы из базы данных по запросу AJAX.И мне нужно изменить параметр данных в AJAX-запросе, когда кнопка нажата, и обновить таблицу.

Вот мой код обработчика кнопки:

$("#btnView").on('click', function () {
        var dt = $("#dtStart").val();
        var cn = $("#txtConn").val();
        var sendData = JSON.stringify({ dt: dt, cn: cn });
        //setMyNewParameters(sendData);
        //$('#tblConnoteList').DataTable().ajax.reload()
        $.ajax({
            type: "POST",
            url: "/Order/myList?param=" + sendData,
            beforeSend: function (xhr) {
                xhr.setRequestHeader("XSRF-TOKEN",
                    $('input:hidden[name="__RequestVerificationToken"]').val());
            },
            datatype: "json",
            traditional: true
        })
            .done(function (data) {

                var table = $('#tblConn').DataTable({
                    data: data.data,
                    destroy: true,
                    "columns": [
                        { "data": "ConnDate" },
                        { "data": "ConnNumber" },
                        { "data": "Customer" }
                    ],
                    "ordering": true,
                    "paging": true,
                    "pageLength": 10,
                    "searching": false, "bPaginate": false
                });
            });

    });

и код позади:

public IActionResult OnPost(string param)
{
        var requestFormData = Request.Form;
        lstConnoteData = ConnoteData();
        List<CoreGPS.Models.Bagging> lstItems = GetData();

        var listItems = ProcessCollection(lstConnoteData, requestFormData);

        // Custom response to bind information in client side
        dynamic response = new
        {
            data = listItems,
            draw = requestFormData["draw"],
            recordsFiltered = listItems.Count,
            recordsTotal = listItems.Count
        };

        return new OkObjectResult(response);
}

Я всегда получаю сообщение об ошибке

Неверный тип содержимого

Ошибка в коде позади

Есть ли какие-либорешение отправить параметр в ajax и применить ответ в datatable?

1 Ответ

0 голосов
/ 10 декабря 2018

Проверьте параметры настройки, доступные для запросов AJAX:

contentType :

Это тип содержимого запроса, который вы делаете.По умолчанию используется application / x-www-form-urlencoded.

dataType :

Это тип данных, которые вы ожидаете получить обратно.Допустимые значения: текст, XML, JSON, скрипт, HTML JSONP.Если вы не укажете значение, jQuery проверит MIME-тип ответа и примет решение на его основе.

Solution1:

Значение по умолчанию contentType:application/x-www-form-urlencoded.Таким образом, вы можете использовать:

$("#btnView").on('click', function () {
            var dt = "A";
            var cn = "B";
            var sendData = { dt: dt, cn: cn } ;

            $.ajax({
                type: "POST",
                url: "/Home/myList?param=" + "whatever",
                data: sendData,
                beforeSend: function (xhr) {
                    xhr.setRequestHeader("XSRF-TOKEN",
                        $('input:hidden[name="__RequestVerificationToken"]').val());
                },
                datatype: "json",
                traditional: true
            })

И на стороне сервера вы можете получить значение от var requestFormData = Request.Form;

Solution2: Если вы хотите опубликовать JSON, вы можете использовать JSON.stringify и установите contentType: "application/json":

    $("#btnView").on('click', function () {
            var dt = "A";
            var cn = "B";
            var sendData = { dt: dt, cn: cn } ;

            $.ajax({
                type: "POST",
                url: "/Home/myList",
                data: JSON.stringify(sendData),
                beforeSend: function (xhr) {
                    xhr.setRequestHeader("XSRF-TOKEN",
                        $('input:hidden[name="__RequestVerificationToken"]').val());
                },
                contentType: "application/json", 
                datatype: "json",
                traditional: true
            })

А на стороне сервера попробуйте извлечь ваши параметры в отдельный класс DTO:

public class ParentDTO
{
      public string dt { get; set; }
      public string cn { get; set; }
}

И принять параметры:

public IActionResult myList([FromBody] ParentDTO parentDTO)
{
    ... 

}
...