Ошибка "Недопустимый примитив JSON: модели". на источнике данных Kendo Grid при передаче модели в контроллер

Получение ошибки при реализации встроенного редактирования Kendo Grid CRUD. Когда я добавляю новую запись и обновляю ее, я получаю код ответа 500 с ошибкой:

Я считаю, что проблема исходит от parameterMap, Как правильно передать модель контроллеру в Kendo?

Недопустимый примитив JSON: модели.

Какие модели?

Исходный код:

$(document).ready(function () {
        var baseUrl = "/SomeUrl",
            dataSource = new kendo.data.DataSource({
                transport: {
                    read: {
                        url: baseUrl + "/GetAccolades?profileId=" + @profileId,
                        type: "GET",
                        dataType: "json"
                    },
                    create: {
                        url: baseUrl + "/AddAccolade",
                        type: "POST",
                        dataType: "json",
                        contentType: "application/json",
                    },
                    update: {
                        url: baseUrl + "/UpdateAccolade",
                        type: "PUT",
                        dataType: "json",
                        contentType: "application/json",
                    },
                    delete: {
                        url: baseUrl + "/DeleteAccolade",
                        type: "DELETE",
                        dataType: "json"
                    },
                    parameterMap: function (options, operation) {
                        if (operation !== "read" && options.models) {
                            alert(kendo.stringify(options.models));
                            return { models: kendo.stringify(options.models) };
                        }
                    }
                },
                batch: true,
                schema: {
                    model: {
                        id: "ProfileAccoladeID",
                        fields: {
                            ProfileAccoladeID: { editable: false, nullable: false },
                            ProfileID: { editable: false, nullable: false, defaultValue: @profileId  },
                            Years: { type: "string" },
                            Name: { type: "string" },
                            Level: { type: "string" },
                            Event: { type: "string" },                              
                        }
                    }
                }
            });

        $("#accolades-grid").kendoGrid({
            dataSource: dataSource,
            pageable: false,
            height: 550,
            toolbar: ["create"],
            columns: [
                { field: "Years", width: "150px" },
                { field: "Name", title: "Name", width: "150px" },
                { field: "Level", title: "Level", width: "150px" },
                { field: "Event", title: "Event", width: "450px" },                    
                { command: ["edit", "destroy"], title: " ", width: "250px" }],
            editable: "inline"
        });
    });
</script>

Контроллер метод:

    [HttpPost]
    public JsonResult AddAccolade(ProfileAccolade accolade)
    {
        using (var db = new XXXEntities())
        {
            if (accolade != null)
            {
                var newAccolade = new ProfileAccolade()
                {
                    ProfileID = accolade.ProfileID,
                    Years = accolade.Years,
                    Name = accolade.Name,
                    Level = accolade.Level,
                    Event = accolade.Event
                };
                db.ProfileAccolades.Add(newAccolade);
                db.SaveChanges();

                return Json(new { Success = true });
            }
            else
            {
                return Json(new { Success = false, Message = "Error occured" });
            }
        }
    }

Как я могу исправить эту ошибку?

Обновить:

Удаляя contentType: "application/json", Ошибка Invalid JSON primitive: models. ушел Однако контроллер не получает модель.

Есть идеи, чтобы это исправить?

1 ответ

Решение

Проблема возникла из-за использования contentType: "application/json" внутри обоих transport.create а также transport.update часть kendo.data.DataSource, Поскольку обе операции используют вызов AJAX (т.е. jQuery.ajax() метод), contentType Настройка влияет на тип тела запроса.

Установив "application/json" Тип содержимого, тело запроса будет обрабатываться как содержимое JSON, но на самом деле transport.parameterMap возвращает URL кодированную версию, содержащую models и отформатировал строку JSON как пару ключ-значение (KVP). Вот почему возникает ошибка "Недопустимый примитив JSON", поскольку кодированный в формате URL формат не совпадает с форматом JSON.

Если вы хотите сохранить "application/json" настройка для вызова AJAX, добавить JSON.stringify метод для преобразования URL в закодированный формат models как данные JSON:

parameterMap: function (options, operation) {
    if (operation !== "read" && options.models) {
        return JSON.stringify({ models: kendo.stringify(options.models) });
    }
}

Однако, если вы хотите отправить parameterMap как тип контента по умолчанию (application/x-www-form-urlencoded), просто удали все contentType определения, чтобы установить его обратно:

dataSource = new kendo.data.DataSource({
     transport: {
         read: {
             url: baseUrl + "/GetAccolades?profileId=" + @profileId,
             type: "GET",
             dataType: "json"
         },
         create: {
             url: baseUrl + "/AddAccolade",
             type: "POST",
             dataType: "json"
         },
         update: {
             url: baseUrl + "/UpdateAccolade",
             type: "PUT",
             dataType: "json"
         },
         delete: {
             url: baseUrl + "/DeleteAccolade",
             type: "DELETE",
             dataType: "json"
         },
         parameterMap: function (options, operation) {
             if (operation !== "read" && options.models) {
                 alert(kendo.stringify(options.models));
                 return { models: kendo.stringify(options.models) };
             }
         }
     },
     // other DataSource definitions
});

Ссылка:

kendo.data.DataSource (документация по пользовательскому интерфейсу Kendo)

Другие вопросы по тегам