Ошибка "Недопустимый примитив 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)