Kendo网格自动编辑,自动保存工作,但字段值在UI中恢复

时间:2013-12-17 17:54:57

标签: grid kendo-ui kendo-asp.net-mvc

在Kendo网格(v2013.3)中,我想在用户移动到另一行时自动保存一行。所以我编写了更改事件,在更改行选择时触发,调用grid.saveChanges()。然后我重新选择我们更改的行(因为saveChanges似乎取消了行选择。)最后,我调用grid.editRow(row)以使新行处于编辑模式。

这几乎可以正常工作。当用户更改A行中的值,然后单击B行时,保存操作会正确发生,Web应用程序会看到更改后的值。但是,UI本身会恢复为旧值。这是因为调用grid.editRow()。

我怀疑剑道正在幕后取消,即使已经保存了已更改的数据。

有关如何解决此问题的建议?这是变更处理程序:

 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>

0 个答案:

没有答案