我使用 kendo ui tools 开发了一个网络应用程序,并且使用批量修改模式创建了一个剑道网格。
但是当我按下删除按钮以获取剑道网格中的任何记录时,它将从网格中的列表中删除但实际上不在数据源中。当我重新加载页面或网格时,删除的项目仍然存在..
这是我网格的代码
<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: " " }
]
});
});
</script>
无法确定故障在哪里,有人可以帮我解决这个问题。
答案 0 :(得分:36)
删除不起作用有三个常见原因:
1。未将网格的editable
设置为inline
或popup
。删除的项目将通过传输销毁自动处理仅针对“内联”/“弹出”编辑模式。例如:
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
设置为inline
或popup
答案 1 :(得分: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
});
当数据发生变化时,这会自动将您对网格所做的更改与服务器同步。
答案 2 :(得分:0)
嗯尝试不包括type: "POST",
,看看它现在是否有效,因为据我所知,该版本中没有包含该位,我认为我上次进行内联编辑时不包括它删除。
答案 3 :(得分:0)
我在服务器删除方法上为int设置了一个任意名称。
[HttpPost]
public ActionResult DeleteRandomTest(Int32 randomTestId)
{
...
}
默认的模型绑定器可能正在寻找一个名为Id的属性(根据模型的配置,与我的类型的主键相同)。
.Model(config => config.Id(p => p.Id))
事实上,我通过将签名更改为以下内容来证明这一点:
[HttpPost]
public ActionResult DeleteRandomTest(Int32 Id)
{
...
}
之后我的突破点被击中了。
最终,我使用完整类型作为Kendo示例中显示的参数,因为我不希望在操作中具有命名不佳的参数名称(不是驼峰案例)。如下所示:
[HttpPost]
public ActionResult DeleteRandomTest([DataSourceRequest]
DataSourceRequest request, RandomDrugTest randomDrugTest)
{
...
}
这似乎是它不起作用的原因。
答案 4 :(得分:0)
我有同样的问题。我的问题是由于在剑道模型中有data
属性造成的。例如:
{id: 1, data: ""}