【问题标题】:kendo grid delete command not working剑道网格删除命令不起作用
【发布时间】:2013-07-06 13:14:35
【问题描述】:

我使用 kendo ui tools 开发了一个 web 应用程序,并且有一个带有 批量编辑模式的剑道网格..

但是当我按下剑道网格中任何记录的删除按钮时,它将从网格列表中删除,但实际上不在数据源中。当我重新加载页面或网格时,删除的项目仍然存在..

这是我的网格的代码

<div id="grid">
        </div>
        <script type="text/javascript">

            $("#submitMarketUser").click(function () {
                var grid = $("#grid").data("kendoGrid");
                var dataSource = new kendo.data.DataSource({
                    transport: {
                        read: {
                            url: "WholeSaleTrade/GetTradeProductDetail",
                            dataType: "json",
                            data: {
                                test: $("#Names").val()
                            }
                        },
                        destroy: {
                            url: "WholeSaleTrade/DeletePro",
                            type: "POST",
                            dataType: "jsonp",
                            data: {
                                DAKy: $("#Names").val(),
                                DIKy: $("#btntxt").val()
                            }
                        },
                        create: {
                            url: "WholeSaleTrade/CreateProduct",
                            type: "POST",
                            dataType: "jsonp",
                            data: {
                                AKy: $("#Names").val(),
                                IKy: $("#btntxt").val()
                            }
                        }
                    },
                    pageSize: 5,
                    schema: {
                        model: {
                            id: "ProductKey",
                            fields: {
                                ProductKey: { editable: false, nullable: true },
                                ProductName: { validation: { required: true} }
                            }
                        }
                    }
                });
                $("#grid").kendoGrid({
                    dataSource: dataSource,
                    editable: true,
                    toolbar: ["create", "save"],
                    autobind: true,
                    pageable: true,
                    columns: [
                        { field: "ProductName", title: "Product Name",
                            editor: function (container, options) {
                                var model = options.model;
                                $('<input id="btntxt" name="' + options.field + '"/>').appendTo(container).kendoComboBox({
                                    dataSource: {
                                        type: "POST",
                                        transport: {
                                            read: {
                                                url: "MarketInformation/PopulateProducts",
                                                success: function (data) {
                                                    var prod = data[0];
                                                    model.set("ProductName", prod.ItmNm);
                                                    model.set("ItmKy", prod.ItmKy);
                                                    model.set("UserKey", $("#Names").val());
                                                }
                                            }
                                        }
                                    },

                                    dataValueField: "ItmKy",
                                    dataTextField: "ItmNm"
                                });
                            }
                        },
                        { command: ["destroy"], title: "&nbsp;" }
                    ]
                });
            });

        </script>

无法确定故障出在哪里,请有人帮我解决这个问题。

【问题讨论】:

  • 你检查浏览器控制台是否有错误?
  • 你使用 Firebug 还是类似的?执行您的javascript时是否显示任何错误。我已经尝试过你的代码并且它有效,但我当然做了一些修改,因为我没有你的所有项目。
  • 那么你能把你的修改发给我吗..
  • 是的,我用萤火虫检查过,它不会触发用于删除控制器中记录的方法..这就是问题
  • 您是否点击了“保存更改”?

标签: kendo-ui kendo-grid


【解决方案1】:

删除不起作用的三个常见原因:


1. 未将 grideditable 设置为 inlinepopup。删除的项目将通过传输销毁自动处理,仅适用于“内联”/“弹出”编辑模式。例如:

editable: {
   mode: "inline",
}
//or
editable: "inline"


2.如果在您的数据源上,您将batch 标志设置为true,这意味着数据源将进行调用在您告诉它之后,例如调用sync()。例如:

var dataSource = new kendo.data.DataSource({
    batch: true,
    //.....
});
//... in some where e.g in a save button click event call the following line:
dataSource.sync();


3.您应该将id 定义为数据源model 内的数据库字段名称的主键。例如:

   model: {
        id: "ProductID",
        fields: {
            ProductID: { editable: false, nullable: true },
        }
    }


所以你的代码的问题是第一个,即你没有将editable设置为inlinepopup

【讨论】:

    【解决方案2】:

    如果您选择不包含editable.mode 以利用单元格内编辑,您可以设置网格的toolbar 以包含选项save

    $("#grid").kendoGrid({
        dataSource: {
            transport: {
                ....
            },
            schema: {
                ....
            }
        },                        
        toolbar: ["create", "save", "cancel"],
        columns: [
            ....
        ],
        editable: true
    });
    

    这将在网格的工具栏上创建一个save 按钮。通过单击destroy 命令按钮删除任何记录后,单击save 按钮使网格向服务器发出Ajax 调用以删除记录。

    如果您希望在不包含save 按钮的情况下自动删除记录,您可以将change 事件处理程序添加到网格的datasource

    $("#grid").kendoGrid({
        dataSource: {
            transport: {
                ....
            },
            schema: {
                ....
            },
            change: function(e) {
                if (e.action === "remove") {
                    this.sync();
                }
            }
        },                        
        columns: [
            ....
        ],
        editable: true
    });
    

    当有数据更改时,这将自动将您对网格所做的更改与服务器同步。

    【讨论】:

      【解决方案3】:

      嗯,尝试不包括type: "POST",,看看它现在是否有效,因为据我所知,演示中没有包含该位,而且我认为我上次进行内联编辑/删除时没有包含它。

      【讨论】:

        【解决方案4】:

        我在服务器 Delete Method 上为 int 设置了一个任意名称。

            [HttpPost]
            public ActionResult DeleteRandomTest(Int32 randomTestId)
            {
                 ...
            }
        

        默认的modelbinder可能正在寻找一个名为Id的属性(根据模型的配置与我的类型的主键相同)。

         .Model(config => config.Id(p => p.Id))
        

        事实上,我通过将签名更改为以下内容来证明这一点:

            [HttpPost]
            public ActionResult DeleteRandomTest(Int32 Id)
            {
                ...
            }
        

        在那之后我的断点被击中。

        最终,我使用完整类型作为参数,如 Kendo 示例中所示,因为我不想在动作中使用名称不佳的参数名称(不是驼峰式大小写)。如下图:

            [HttpPost]
            public ActionResult DeleteRandomTest([DataSourceRequest]
                 DataSourceRequest request, RandomDrugTest randomDrugTest)
            {
               ...
            }
        

        这似乎是它不起作用的原因。

        【讨论】:

          【解决方案5】:

          我有同样的问题。我的问题是由剑道模型中的 data 属性引起的。示例:

          {id: 1, data: ""}
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2014-01-03
            • 2012-11-25
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-06-22
            • 1970-01-01
            相关资源
            最近更新 更多