我使用razor Html Helper创建一个Kendo UI Grid。创建网格,以便通过弹出窗口表单完成记录的编辑。这是代码
@(Html.Kendo().Grid<MyObject>()
.Name("grid")
.Editable(edit => edit
.Enabled(true)
.Mode(GridEditMode.PopUp)
)
.Columns(columns =>
{
// Column declaration
})
.ToolBar(toolbar =>
{
toolbar.Create());
})
.DataSource(dataSource => dataSource
.Ajax()
.Model(model => model.Id(m => m.Id))
.ServerOperation(false)
.Events(e =>
{
e.Error("error_handler");
e.Sync("sync_handler");
})
.Read("Read", "MyController")
.Create(c => c.Action("Create", "MyController"))
.Update(u => u.Action("Edit", "MyController"))
)
)
我在数据源的错误和同步事件上设置了一个处理程序。同步处理程序强制从服务器读取,因为必须在创建和更新操作时刷新某些数据。如果在创建或更新时发生错误,则错误处理程序应该阻止刷新网格。这是我的两个处理程序
function error_handler(e) {
if (e.errors) {
$('#grid').data("kendoGrid").one("dataBinding", function (ss) {
ss.preventDefault(); // cancel grid rebind if error occurs
});
}
}
function sync_handler(e) {
e.sender.read();
}
我的问题是,即使我在同步操作上调用ss.preventDefault
,我的同步处理程序仍会被调用,而对e.sender.read()
的调用会导致我的弹出窗口窗体关闭。如果我删除我的同步处理程序,ss.preventDefault
调用阻止我的弹出窗口窗体正确关闭,所以问题实际上是关于始终调用的同步处理程序,即使出错也是如此。知道怎么处理这个吗?
我最终做到了这一点,不是最好的,但至少解决了mt问题
function error_handler(e) {
if (e.errors) {
e.sender.preventSync = true;
$('#grid').data("kendoGrid").one("dataBinding", function (ss) {
ss.preventDefault(); // cancel grid rebind if error occurs
// do some stuff here
});
}
}
function sync_handler(e) {
if (!e.sender.preventSync)
e.sender.read();
e.sender.preventSync = false;
}