Команда удаления команды kendo не работает
Я разработал веб-приложение с помощью kendo ui tools, а theres - сетку кендо с режимом пакетного редактирования..
но когда я нажимаю кнопку удаления для любой записи в сетке кендо, она будет удаляться из списка в сетке, но на самом деле не в источнике данных. Когда я перезагружаю страницу или сетку, удаленный элемент все равно будет существовать.
вот код моей сетки
<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>
не может определить, где происходит ошибка, и кто-нибудь может помочь мне решить этот вопрос.
Ответы
Ответ 1
Существует три распространенных причины, по которым удаление не будет работать:
1. Не устанавливать editable
сетки в inline
или popup
. Удаленные элементы будут автоматически обработаны посредством транспорта, уничтожающего только для режимов редактирования 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
Ответ 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
Я поставил имя арбитра для 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)
{
...
}
Это, по-видимому, причина, по которой он не работал.
Ответ 5
У меня была такая же проблема. Моя проблема была вызвана наличием свойства data
в модели кендо. Пример:
{id: 1, data: ""}