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: " " }
]
});
});
</script>
障害がどこに向かっているのか特定できず、誰かがこの問題を解決するのを手伝ってくれませんか。
セル内編集を利用するために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
});
これにより、データが変更されたときに、グリッドに加えた変更がサーバーと自動的に同期されます。
私も同じ問題を抱えていました。私の問題は、剣道モデルにdata
プロパティがあることが原因でした。例:
{id: 1, data: ""}
サーバーのDeleteメソッドにintの任意の名前を付けていました。
[HttpPost]
public ActionResult DeleteRandomTest(Int32 randomTestId)
{
...
}
デフォルトのmodelbinderは、おそらくIdというプロパティを探していました(モデルの構成に応じて、私のタイプの主キーと同じです)。
.Model(config => config.Id(p => p.Id))
実際、私は署名を次のように変更することでこれを証明しました。
[HttpPost]
public ActionResult DeleteRandomTest(Int32 Id)
{
...
}
その後、私のブレークポイントに到達しました。
最終的には、剣道の例に示すように、完全な型をパラメーターとして使用しました。これは、アクションでパラメーター名の名前が不適切(キャメルケースではない)にしたくないためです。次のように表示されます。
[HttpPost]
public ActionResult DeleteRandomTest([DataSourceRequest]
DataSourceRequest request, RandomDrugTest randomDrugTest)
{
...
}
これが機能しなかった理由のようです。
うーん、type: "POST",
を含めないようにして、デモにビットが含まれておらず、最後にインライン編集/削除を行ったときに含めていないと思うので、今は機能するかどうかを確認してください。