【发布时间】:2013-12-17 17:54:56
【问题描述】:
在剑道网格 (v2013.3) 中,我想在用户移动到另一行时自动保存一行。因此,我编写了更改事件(当行选择更改时触发)来调用 grid.saveChanges()。然后我重新选择我们更改为的行(因为 saveChanges 似乎取消了行选择。)最后,我调用 grid.editRow(row) 以便新行处于编辑模式。
这几乎可以正常工作。当用户更改 A 行中的值,然后单击离开 B 行时,保存操作会正确发生,并且 Web 应用程序会看到更改的值。但是,UI 本身会恢复为旧值。这是因为调用了 grid.editRow()。
我怀疑 Kendo 正在幕后取消,即使更改的数据已经保存。
关于如何解决这个问题的建议?这是更改处理程序:
ViLinking.gridItemSelected = function (e) {
var row = ViLinking.getSingleSelectedRow(this);
if (row == null) {
return;
}
var dataItem = this.dataItem(row);
if (dataItem == ViLinking.currentDataItem) {
return;
}
// apparently the row reference does not survive saveChanges() so prepare to re-get it.
ViLinking.currentDataItem = dataItem;
var dataUid = row.attributes["data-uid"];
var table = $(row).closest("table");
ViLinking.setKendoUpdateContentType(this);
this.saveChanges();
row = table.find('tr[data-uid="' + dataUid.value + '"]');
this.select(row);
this.editRow(row);
};
这是生成表的视图部分(它是一个子表)
<script id="ViDetailsTemplate" type="text/kendo-tmpl">
@(Html.Kendo().Grid<VendItemProxyForUi>()
.Name("details_#=ItemOid#")
.Columns(cs =>
{
cs.Bound(c => c.ItemOid).Hidden();
cs.Bound(c => c.VendorItemID);
cs.Bound(c => c.IsSplit);
cs.Bound(c => c.VendorItemName);
cs.Bound(c => c.VendorItemPackSize);
cs.Bound(c => c.IsCatchweight);
cs.Bound(c => c.IsApproved);
cs.Bound(c => c.UofMOidForUi).EditorTemplateName("UofmDdTemplate");//.ClientTemplate("#=UofMName#");
cs.Bound(c => c.UofMName);
cs.Command(command =>
{
command.Edit();
command.Destroy();
}).Width(200);
}
)
.Selectable()
.Editable(edit => edit.Mode(GridEditMode.InLine))
.DataSource(ds => ds
.Ajax()
.Model(mdl =>
{
mdl.Id(vi => vi.VendorItemID);
mdl.Field(f => f.VendorItemID).Editable(false);
mdl.Field(f => f.VendorItemName).Editable(false);
mdl.Field(f => f.IsSplit).Editable(false);
mdl.Field(f => f.IsCatchweight).Editable(false);
mdl.Field(f => f.DiscontinueDate).Editable(false);
mdl.Field(f => f.IsRestricted).Editable(false);
mdl.Field(f => f.VendorItemPackSize).Editable(false);
mdl.Field(f => f.IsApproved).Editable(true);
mdl.Field(f => f.UofMName).Editable(true);
}
)
.Read(read => read.Action("GetVisForGi", "ViLinkingWorksheet", new { _msk = Model.MultiSessionKey, itemOid="#=ItemOid#"}))
.Update(update => update.Action("SyncModelFromUi", "ViLinkingWorksheet", new { _msk = Model.MultiSessionKey, itemOid="#=ItemOid#", delete=false}))
.Destroy(update => update.Action("SyncModelFromUi", "ViLinkingWorksheet", new { _msk = Model.MultiSessionKey, itemOid="#=ItemOid#",delete=true}))
)
//.HtmlAttributes(new { style = "height:100px;" })
.Events(ev =>
{
ev.Change("ViLinking.gridItemSelected");
ev.Cancel("ViLinking.saveOnCancel");
})
//.Navigatable()
.ToClientTemplate())
</script>
【问题讨论】:
-
你能发布剩下的视图代码和相关的控制器动作吗?
-
我将编辑我的帖子以添加一些代码,但我确实认为这个 sn-p 是相关的,如果你相信我的话 1) 这个 JS 代码是由更改调用的事件和 2) 控制器方法是一个返回 null 的存根。此外,如果我在行上单击剑道
按钮,行为也很好。这只是在导致失败的不同行上调用编辑的情况。
标签: grid kendo-ui kendo-asp.net-mvc