簡體   English   中英

將數組作為參數從JavaScript中的ajax調用傳遞給控制器

[英]Pass an array as parameter to a controller from an ajax call in JavaScript

我正在開發一個ASP.NET MVC 4網站,我遇到了一些功能問題。 我解釋一下,我要選擇一個表中顯示的實體及其鏈接的復選框:

我的表格的屏幕截圖,其中每一行都有一個與實體具有相同ID的復選框

控制台顯示陣列中的更新

在我的腳本中,我已經能夠將每個已檢查的Id的復選框存儲在一個數組中,如果取消選中該復選框,則將其刪除。 但是我無法將數組傳遞給我的控制器函數來刪除數據庫中的每個選定實體。 我使用來自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在我的控制器中調用以下函數:

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

關於這個問題的任何想法? 我希望我足夠清楚。 如果您需要更多細節,請不要猶豫。

也許JSON數組中的數據類型不是字符串? (如果您有[45,64,34,6]形式的數組,或者像[345,"wef4"]這樣的混合數組,則會發生這種情況)。

要確保某些東西是Javascript中的字符串,您可以這樣做: var string = "".concat(otherVar);

嘗試將您的ajax數據更改為類似的內容。

 data : JSON.stringify({'docsToDelete':docsArray}),

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

對代碼進行這些更改。


在Jquery

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...
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM