I am returning errors from server and catch it in kendo datasource error event.In this event I am trying to prevent close popup editor, but it works only first time, after clicking update second time, the window closes.
I searched a lot but could not find a solution
City = {
InitializeGrid: function () {
function LoadCities(url, success) {
Common.serverRequest(url, success);
}
function UpdateCity(url, params, success) {
Common.serverRequestParams(url, params, success);
}
function InsertCity(url, params, success) {
Common.serverRequestParams(url, params, success);
}
function DeleteCity(url, id, success) {
Common.serverRequestParams(url, id, success);
}
dataSource = new kendo.data.DataSource({
transport: {
read: function (e) {
LoadCities("/home/read", function (res) {
e.success(res);
});
},
update: function (e) {
UpdateCity("/home/update", e.data, function (res) {
var grid = $("#grid").data("kendoGrid");
if (res.success) {
grid.dataSource.read();
} else {
e.error("", "", res.error);
grid.cancelChanges();
}
});
},
create: function (e) {
InsertCity("/home/insert", e.data, function (res) {
var grid = $("#grid").data("kendoGrid");
if (res.success) {
grid.dataSource.data(res.data);
} else {
e.error("", "", res.error);
grid.cancelChanges();
}
});
},
destroy: function (e) {
DeleteCity("/home/delete", e.data, function (res) {
var grid = $("#grid").data("kendoGrid");
if (res.success) {
grid.dataSource.data(res.data);
} else {
e.error("", "", res.error);
grid.cancelChanges();
}
});
}
},
error: function (e) {
var grid = $("#grid").data("kendoGrid");
grid.one("dataBinding", function (e) {
e.preventDefault(); // it occures only first time
});
alert(e.errorThrown);
},
pageSize: 20,
schema: {
model: {
id: "Id",
fields: {
Name: { type: "string" },
EndDate: { type: "date" },
CreateDate: { type: "date" }
}
}
}
});
$("#grid").kendoGrid({
dataSource: dataSource,
height: 750,
selectable: "single",
filterable: true,
sortable: true,
pageable: true,
toolbar: [{ name: "newRecord", text: "New Record" }, { name: "editRecord", text: "Edit REcord" }, { name: "deleteRecord", text: "Delete" }],
columns: [
{ field: "Name", title: "Name" },
{ field: "EndDate", title: "End Date", format: "{0:dd.MM.yyyy hh:mm}" },
{ field: "CreateDate", title: "Create Date", format: "{0:dd.MM.yyyy hh:mm}" }
],
editable: {
mode: "popup",
confirmation: false,
template: kendo.template($("#popup_editor").html())
}
});
$("#grid").on("click", ".k-grid-newRecord", function () {
Common.gridAdd('grid', 'New Record');
});
$("#grid").on("click", ".k-grid-editRecord", function () {
Common.gridEdit('grid', 'Edit Record');
});
$("#grid").on("click", ".k-grid-deleteRecord", function () {
Common.gridDelete('grid');
});
}
}
mvc controler
public class HomeController : Controller
{
List<
City
> cities;
public string error { get; set; }
public bool isSuccess { get; set; } = true;
public ActionResult Index()
{
cities = new List<
City
>();
Session["city"] = cities;
return View();
}
public ActionResult Read()
{
var result = (List<
City
>)Session["city"];
return Json(result);
}
public ActionResult Update(City item)
{
var result = (List<
City
>)Session["city"];
if (string.IsNullOrEmpty(item.Name))
{
error = "Name is required";
isSuccess = false;
}
result.Where(w => w.Id == item.Id).SingleOrDefault(s => s == item);
return Json(new { success = isSuccess, error =error, data = item });
}
public ActionResult Insert(City item)
{
var result = (List<
City
>)Session["city"];
item.Id = result.Count;
item.Id++;
if (string.IsNullOrEmpty(item.Name))
{
error = "Name is required";
isSuccess = false;
}
result.Add(item);
return Json(new { success = isSuccess, error = error, data = item });
}
public ActionResult Delete(City item)
{
var result = (List<
City
>)Session["city"];
result.Remove(item);
return Json(new { success = isSuccess });
}
}