从 JavaScript 中的 ajax 调用将数组作为参数传递给控制器

新手上路,请多包涵

我在 ASP.NET MVC 4 网站上工作,但在功能方面遇到了一些麻烦。我解释一下,我必须选择表格中显示的实体及其链接的复选框:

我的表的屏幕截图,其中每一行都有一个与实体具有相同 ID 的复选框

显示阵列更新的控制台

在我的脚本中,我已经能够将每个选中的 Id 的复选框存储在一个数组中,如果未选中该复选框,则将其删除。但是我无法将数组传递给我的控制器的函数来删除数据库中的每个选定实体。我使用 $.ajax() 从 jquery 通过 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 在我的控制器中调用以下函数:

     [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);
            }
        });
    }

关于这个问题的任何想法?我希望我已经足够清楚了。如果您需要更多详细信息,请不要犹豫。

原文由 user6208218 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 278
2 个回答

如果您从 $.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 ');
        }
    });
}

原文由 Sachin 发布,翻译遵循 CC BY-SA 3.0 许可协议

对您的代码进行这些更改。


在查询中

data: docsArray, 不需要对数组进行字符串化


在控制器中

    [Authorize]                                                //remove [WebMethod]
    public ActionResult DeleteDocuments(string[] docsToDelete) //Add ActionResult, Change parameter to accept array
    {
        int id;
        string[] arrayDocs = docsToDelete;     //no need of deserilization

        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(id);    //return id back to ajax call...
    }

原文由 Rajshekar Reddy 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题