问题描述
试图弄清楚为什么我的AJAX通话不起作用。我有一个datagrid,用户可以在其中选择要删除的行;然后按下删除按钮应将这些选定行的ID作为数组发送到我的控制器进行处理。我的控制器只收到一个空的int数组。
这是我的代码,如果有人可以看到我在做错的明显事情,将不胜感激:
@(Html.DevExtreme().Button()
.ID("gridDeleteSelected")
.Text("Purge Selected")
.Height(34)
.Type(ButtonType.Default)
.StylingMode(ButtonStylingMode.Outlined)
.Width(120)
.Disabled(true)
.OnClick("purgeSelectedBatches")
)
我相关的JavaScript(当用户在datagrid中选择行时会调用selectedLoadContexts方法):
<script>
var recordsToBePurged;
function selectLoadContexts(data) {
var purgeButton = $("#gridDeleteSelected").dxButton("instance");
purgeButton.option("disabled",!data.selectedRowsData.length);
recordsToBePurged = data;
}
function purgeSelectedBatches() {
var selectedKeys = recordsToBePurged.selectedRowKeys;
console.log("selected keys = " + selectedKeys);
$.ajax({
url: "@Url.Action("PurgeSelected","Purge")",type: 'POST',contentType: "application/json; charset=utf-8",dataType: 'JSON',data: JSON.stringify({selectedKeys : selectedKeys}),success: function() {
var url = '@Url.Action("PurgeSelected","Purge")' +
'?selectedKeys=' +
selectedKeys;
window.location = url;
}
}).done(function() {
DevExpress.ui.notify("Purging selected batches marked as Do Not Retain: ","info",1500);
console.log("Purging selected batches marked as Do Not Retain");
});
}
</script>
我的控制器方法:
[HttpPost]
[Route("[action]")]
public IActionResult PurgeSelected(int[] selectedKeys)
{
//process array of keys and remove selected records
return Ok($" records removed");
}
解决方法
据我所知,recordsToBePurged.selectedRowKeys是一个逗号分隔的字符串,而不是数组。为此,您需要先将字符串转换为整数数组,然后再将其传递给PurgeController的PurgeSelected方法。因此您的代码将类似于
function purgeSelectedBatches() {
var selectedKeys = recordsToBePurged.selectedRowKeys;
console.log("selected keys = " + selectedKeys);
//convert the coma seperated value to an int[] before
var selectedKeysAsArray = selectedKeys.split(',');
$.ajax({
url: "@Url.Action("PurgeSelected","Purge")",type: 'POST',contentType: "application/json; charset=utf-8",dataType: 'JSON',//pass the values as an array and not as string
data: JSON.stringify({selectedKeys : selectedKeysAsArray }),success: function() {
var url = '@Url.Action("PurgeSelected","Purge")' +
'?selectedKeys=' +
selectedKeys;
window.location = url;
}
}).done(function() {
DevExpress.ui.notify("Purging selected batches marked as Do Not Retain: ","info",1500);
console.log("Purging selected batches marked as Do Not Retain");
});
}
}
,
确定,所以我修改了purgeSelectedBatches方法,按如下所示简化了AJAX调用:
function purgeSelectedBatches() {
var selectedKeys = recordsToBePurged.selectedRowKeys;
console.log("selected keys = " + selectedKeys);
if (selectedKeys.length() > 0) {
$.ajax({
url: "@Url.Action("PurgeSelected",dataType: "json",data: { selectedKeys: selectedKeys }
}).done(function() {
DevExpress.ui.notify("Purging selected batches marked as Do Not Retain: ",1500);
console.log("Purging selected batches marked as Do Not Retain");
});
} else {
DevExpress.ui.notify("No records to be purged",1500);
}
}
我从数据中删除了contentType和JSON.stringify。控制器现在将整数数组作为参数接收,该参数包含预期的所选行的键。