【问题标题】:Kendo grid auto-edit, auto-save works but field value reverts in UI剑道网格自动编辑、自动保存有效,但 UI 中的字段值恢复
【发布时间】: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


【解决方案1】:
1- View

 @(Html.Kendo().Grid<User>()
        .Name("GridName")
        .Columns(columns =>
        {
            ...
        })
        .Editable(editable => editable.Mode(GridEditMode.InCell))
        .Pageable(p => p.PageSizes(new[] { 5, 10, 20, 50, 100 }))
        .Groupable()
        .Sortable()
        .Selectable()
        .Scrollable(s => s.Height("auto"))
        .DataSource(ds => ds
            .Ajax()
            .Batch(true)
            .ServerOperation(false)
            .Events(events => events.Error("error_handler"))
            .PageSize(20)
            .Model(model =>
            {
                model.Id(a => a.Id);
            })
            .Read(read => read.Action("Read", "Users"))
            .Update(update => update.Action("Update", "Users"))
          )
          .Events(events => events.Save("SaveChanges"))
            )

        <script>
          function SaveChanges() {
                setTimeout(function() {
                    $("#GridName").data("kendoGrid").dataSource.sync();
                });
        </script>

2- Controller

    public ActionResult Update([DataSourceRequest] DataSourceRequest request, IEnumerable<User> models)
            {
                if (models != null && ModelState.IsValid)
                {
                    if (models.Any())
                    {
                        foreach (var item in models)
                        {
                            Update(item); // Find item in database, modify the properties of the object & save change in database
                        }
                    }
                }

                return Json(models.ToDataSourceResult(request, ModelState));
            }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多