I'm trying to get Gantt working. I've configured it to use server to perform read, create and update. It loads events correctly and displays them on screen. I can update them just fine.
However when I try to create new event, I get CreateEvent method called, I create event on server side, fill in all data, initialize Id field and send it back to server, just as required in documentation and done in demo code. When I try to update this newly created event I get new Create event being called, instead of update.
I assume that this is because UI does not store Id I've returned from server correctly. Even though I return element with Id = 9, I can see in kedo dataSource.data() that one of the elements have Id = 0.
What am I doing wrong?
public ActionResult CreateEvent([DataSourceRequest] DataSourceRequest request, EventVm @event)
{
var tm = new ProjectTimelineVm();
tm.Events.Add(@event);
@event.Id = tm.Events.Max(e => e.Id) + 1;
@event.Start = DateTime.Parse(Request.Form["Start"], System.Globalization.CultureInfo.InvariantCulture);
@event.End = DateTime.Parse(Request.Form["End"], System.Globalization.CultureInfo.InvariantCulture);
@event.OrderId = @event.Id;
@event.Expanded = false;
@event.Summary = false;
return Json(new[] { @event }.ToDataSourceResult(request, ModelState));
}
and client side configuration (note that EventVm has Id property and Id property is expected by model configuration, after page reload newly added event will work fine):
var gantt;
$(function () {
gantt = $("#timelineGantt").kendoGantt({
columns: [
{ field: "Id", title: "ID", sortable: true },
{ field: "title", title: "Title", sortable: true },
{ field: "start", title: "Start", format: "{0: yyyy-MM-dd hh:mm:ss}", sortable: true },
{ field: "end", title: "End", format: "{0: yyyy-MM-dd hh:mm:ss}", sortable: true }],
snap: true,
height: 500,
showWorkDays: false,
showWorkHours: false,
views: [
{ type: "day" },
{ type: "week", selected: true },
{ type: "month" }],
dataSource: {
type: (function () {
if (kendo.data.transports['aspnetmvc-ajax']) {
return 'aspnetmvc-ajax';
} else {
throw new Error('The kendo.aspnetmvc.min.js script is not included.');
}
})(),
transport: {
read: { url: "/Record/Project/ReadEvent" },
prefix: "",
update: { url: "/Record/Project/UpdateEvent" },
create: { url: "/Record/Project/CreateEvent" }
},
schema: {
data: "Data",
total: "Total",
errors: "Errors",
model: {
id: "Id",
fields: {
Id: { type: "number" },
parentId: { from: "ParentId", type: "number", defaultValue: null },
orderId: { from: "OrderId", type: "number" },
percentComplete: { from: "PercentComplete", type: "number" },
start: { from: "Start", type: "date", defaultValue: new Date(2016, 3, 25, 14, 42, 36, 959) },
end: { from: "End", type: "date", defaultValue: new Date(2016, 3, 25, 14, 42, 36, 959) },
title: { from: "Title", type: "string" },
summary: { from: "Summary", type: "boolean", defaultValue: false },
expanded: { from: "Expanded", type: "boolean", defaultValue: false }
}
}
},
},
dependencies: {
type: (function () {
if (kendo.data.transports['aspnetmvc-ajax']) {
return 'aspnetmvc-ajax';
} else {
throw new Error('The kendo.aspnetmvc.min.js script is not included.');
}
})(),
transport: {
read: { url: "" },
prefix: ""
},
schema: {
data: "Data", "total": "Total",
errors: "Errors",
model: {
fields: {
Type: { type: "number" },
DependencyID: { type: "number" },
PredecessorID: { type: "number" },
SuccessorID: { type: "number" }
}
}
},
data: {
Data: [],
Total: 0,
AggregateResults: null
}
}
}).data("kendoGantt");
});