javascript - 将数组作为参数从 JavaScript 中的 ajax 调用传递给 Controller

标签 javascript jquery asp.net ajax asp.net-mvc-4

我正在开发一个 ASP.NET MVC 4 网站,但在功能方面遇到了一些问题。我解释一下,我必须选择表格中显示的实体及其链接的复选框:

Screenshot of my table where each row has a checkbox with the same Id as the entity

Console showing updates in the array

在我的脚本中,我能够将每个选中的 Id 复选框存储在一个数组中,并在未选中该复选框时删除这些复选框。但我无法将数组传递给 Controller ​​的函数来删除数据库中的每个选定实体。 我使用 jquery 中的 $.ajax() 通过 POST 请求发送数组(作为 JSON),但我总是收到 500 错误:

  • JSON 基元无效
  • 空引用

这是我的脚本中的函数(我不知道我的数组格式是否有效):

    var sendDocsToDelete = function (docsArray) {
        $.ajax({
            type: 'POST',
            url: 'Main/DeleteDocuments',
            data: JSON.stringify(docsArray),
            contentType: 'application/json; charset=utf-8',
            datatype: 'json',
            success: function (result) {
                alert('Success ' + result.d);
            },
            error: function (result) {
                alert('Fail ' + result.d);
            }
        });
    }

然后,POST 在我的 Controller 中调用以下函数:

    [Authorize]
    [WebMethod]
    public void DeleteDocuments(string docsToDelete)
    {
        int id; 
        string[] arrayDocs = JsonConvert.DeserializeObject<string[]>(docsToDelete);

        foreach (string docId in arrayDocs)
        {
            int.TryParse(docId, out id);
            dal.DeleteDocument(id); // dal = DataAccessLayer is the class which interacts with the database by executing queries (select, delete, update...)
        }
    }

更新2

    [Authorize]
    public ActionResult DeleteDocuments(int[] docsToDelete)
    {
        try{
               foreach (string docId in arrayDocs)
               {
                       int.TryParse(docId, out id);
                       dal.DeleteDocument(id); // dal = DataAccessLayer is the class which interacts with the database by executing queries (select, delete, update...)
               }
               return Json("Success");
        } 
        catch 
        {
               return Json("Error");
        }
    }


    var sendDocsToDelete = function (docsArray) {
        $.ajax({
            type: 'POST',
            url: 'Main/DeleteDocuments',
            data: docsArray,
            contentType: 'application/json; charset=utf-8',
            datatype: 'json',
            success: function (result) {
                alert('Success ' + result.d);
            },
            error: function (result) {
                alert('Fail ' + result.d);
            }
        });
    }

关于这个问题有什么想法吗?我希望我说得足够清楚。如果您需要更多详细信息,请不要犹豫。

最佳答案

如果您从 $.ajax 正确传递整数数组(即您的 docsArray 应该具有类似于 [15,18,25,30, 42,49])那么你应该尝试:

[Authorize]
public ActionResult DeleteDocuments(int[] docsArray)
{
    //int id; 
    //string[] arrayDocs = JsonConvert.DeserializeObject<string[]>(docsToDelete);
  try {
    foreach (int docId in docsArray)
    {
        //int.TryParse(docId, out id);
        dal.DeleteDocument(docId); // dal = DataAccessLayer is the class which interacts with the database by executing queries (select, delete, update...)
    }
    return "Success ";
  }
  catch {
        return "Error";
  }
}

更新:

您的 JavaScript 代码应该是:

var sendDocsToDelete = function (docsArray) {
    $.ajax({
        type: 'POST',
        url: 'Main/DeleteDocuments',
        data: JSON.stringify(docsArray),
        contentType: 'application/json; charset=utf-8',
        datatype: 'json',
        success: function (result) {
            alert('Success ');
        },
        error: function (result) {
            alert('Fail ');
        }
    });
}

关于javascript - 将数组作为参数从 JavaScript 中的 ajax 调用传递给 Controller ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37325323/

相关文章:

javascript - Select2 获取文本 onchange - 逗号分隔

javascript - 我有一个正在从商店接收数据的组件。如何更新收到的数据并在更改时重新呈现组件

javascript - rails : Javascript does not work on paginated objects

jquery - 移动设备中的 Fancybox 无法正常工作,fancybox overlay 隐藏了 fancybox wrap。

javascript - 使用 NodeJS 和 Mongoose 在 MongoDB 中打开多个连接

javascript - jQuery DataTables 和 Columnfilterwidget 重置所有过滤器按钮

javascript - 下拉搜索菜单

javascript - 在 ASP.net 中调用 Web 服务

c# - 如何在 ASP.NET 中按类而不是 ID 选择元素?

c# - 让页面读取从另一个页面发布到它的值的最佳方法是什么?