#javascript #c# #ajax #asp.net-core #devexpress
#javascript #c# #ajax #asp.net-core #devexpress
Вопрос:
Пытался выяснить, почему мой вызов AJAX не работает. У меня есть datagrid, в котором пользователь может выбирать строки для удаления; нажатие кнопки удаления должно затем отправить идентификаторы этих выбранных строк в виде массива на мой контроллер для обработки. Однако мой контроллер получает только пустой массив int.
Вот мой код, и если кто-то увидит что-то очевидное, что я делаю неправильно, это было бы очень ценно:
@(Html.DevExtreme().Button()
.ID("gridDeleteSelected")
.Text("Purge Selected")
.Height(34)
.Type(ButtonType.Default)
.StylingMode(ButtonStylingMode.Outlined)
.Width(120)
.Disabled(true)
.OnClick("purgeSelectedBatches")
)
Мой соответствующий JavaScript (метод selectedLoadContexts вызывается, когда пользователь выбирает строки в datagrid):
<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");
}
Ответ №1:
Насколько я вижу, recordsToBePurged.selectedRowKeys — это строка, разделенная запятой, а не массив. Для того, чтобы это сработало, вам необходимо преобразовать строку в целочисленный массив, прежде чем передавать ее в метод PurgeSelected PurgeController. Итак, ваш код будет выглядеть примерно так
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");
});
}
}
Комментарии:
1. Привет, спасибо за предложение, но я получаю сообщение об ошибке консоли «Uncaught TypeError: selectedKeys.split не является функцией», что наводит меня на мысль, что это не строка, разделенная запятой (прошу прощения, мой JS крайне ограничен).
2. Привет, попробуйте сделать это так, поскольку перед разделением был ненужный пробел: var selectedKeysAsArray = selectedKeys.split(‘,’); Если это не сработает, то эта ошибка связана с тем, что selectedKeys не является строкой, и нам нужно знать ее тип, прежде чем предлагать что-то еще.
3. Спасибо. Я считаю, что это массив int. Я добавил строку: console.log («первый выбранный ключ: » selectedKeys[0]); И получил это на консоли: первый выбранный ключ: 2
Ответ №2:
ХОРОШО, поэтому я внес изменения в свой метод purgeSelectedBatches, отключив вызов AJAX следующим образом:
function purgeSelectedBatches() {
var selectedKeys = recordsToBePurged.selectedRowKeys;
console.log("selected keys = " selectedKeys);
if (selectedKeys.length() > 0) {
$.ajax({
url: "@Url.Action("PurgeSelected", "Purge")",
type: 'POST',
dataType: "json",
data: { selectedKeys: selectedKeys }
}).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");
});
} else {
DevExpress.ui.notify("No records to be purged", "info", 1500);
}
}
Я удалил ContentType и JSON.stringify из data. Массив целых чисел теперь принимается контроллером в качестве параметра, содержащего ключи выбранных строк, как и ожидалось.