Hi,
I am trying ‘Save all changes with one request’ (http://www.telerik.com/support/code-library/save-all-changes-with-one-request) solution. I modified UpdateCreateDelete() method to return modified data as response to the request. Now I want to make datasource and grid update
themselves smoothly without the additional roundtrip caused by calling read().
Please suggest how I may do this.
I am trying ‘Save all changes with one request’ (http://www.telerik.com/support/code-library/save-all-changes-with-one-request) solution. I modified UpdateCreateDelete() method to return modified data as response to the request. Now I want to make datasource and grid update
themselves smoothly without the additional roundtrip caused by calling read().
Please suggest how I may do this.
public ActionResult UpdateCreateDelete([DataSourceRequest] DataSourceRequest request, [Bind(Prefix = "updated")]List<Order> updatedOrders, [Bind(Prefix = "added")]List<Order> newOrders, [Bind(Prefix = "deleted")]List<Order> deletedOrders) { if (updatedOrders != null && updatedOrders.Count > 0) { for (int i = 0; i < updatedOrders.Count; i++) { var target = orderList.Where(o => o.OrderID == updatedOrders[i].OrderID).FirstOrDefault(); if (target != null) { int targetIndex = orderList.IndexOf(target); orderList[targetIndex].OrderDate = updatedOrders[i].OrderDate; orderList[targetIndex].EmployeeID = updatedOrders[i].EmployeeID; orderList[targetIndex].OrderDescription = updatedOrders[i].OrderDescription; } } } if (newOrders != null && newOrders.Count > 0) { for (int i = 0; i < newOrders.Count; i++) { newOrders[i].OrderID = orderList[orderList.Count - 1].OrderID + 1; orderList.Add(newOrders[i]); } } if (deletedOrders != null && deletedOrders.Count > 0) { for (int i = 0; i < deletedOrders.Count; i++) { var target = orderList.Where(o => o.OrderID == deletedOrders[i].OrderID).FirstOrDefault(); if (target != null) { orderList.Remove(target); } } } List<Order> responseOrders = new List<Order>(); responseOrders.AddRange(updatedOrders); responseOrders.AddRange(newOrders); responseOrders.AddRange(deletedOrders); return Json(responseOrders.ToDataSourceResult(request, ModelState)); //return Json("Success!"); } <script> function sendData() { var grid = $("#Grid").data("kendoGrid"), parameterMap = grid.dataSource.transport.parameterMap; //get the new and the updated records var currentData = grid.dataSource.data(); var updatedRecords = []; var newRecords = []; for (var i = 0; i < currentData.length; i++) { if (currentData[i].isNew()) { //this record is new newRecords.push(currentData[i].toJSON()); } else if(currentData[i].dirty) { updatedRecords.push(currentData[i].toJSON()); } } //this records are deleted var deletedRecords = []; for (var i = 0; i < grid.dataSource._destroyed.length; i++) { deletedRecords.push(grid.dataSource._destroyed[i].toJSON()); } var data = {}; $.extend(data, parameterMap({ updated: updatedRecords }), parameterMap({ deleted: deletedRecords }), parameterMap({ added: newRecords })); $.ajax({ url: "/Home/UpdateCreateDelete", data: data, type: "POST", error: function() { //Handle the server errors using the approach from the previous example }, success: function (result) { // How to make datasource and grid update themselves smoothly without the additional roundtrip caused by calling read() } }); }</script>