尝试将JavaScript数组传递给我的ASP.NET Core控制器失败

问题描述

试图弄清楚为什么我的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");
    }

Console image added

Network image added

解决方法

据我所知,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。控制器现在将整数数组作为参数接收,该参数包含预期的所选行的键。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...