2014-01-22 130 views
10

在MVC 4中,如何將View中的JavaScript數組傳遞給帶有AJAX的Controller中的函數?C#MVC 4:將View中的JavaScript數組傳遞給控制器​​

這似乎並不工作:

$.ajax(
     { 
      type: "POST", 
      url: "../Home/SaveTable", 
      data: { function_param: countryArray } 
     }); 

問題是,countryArray是在JavaScript查看一個全局數組和我檢查它具有傳遞之前,它的元素。但是,當saveTable函數接收數組時,函數會說它收到一個空字符串[]數組。

我只知道傳遞數組從控制器查看,序列化複雜的數據類型與return Json(data, JsonRequestBehavior.AllowGet);,然後反序列化將其設置爲「VAR」變量它。

所以我可能必須這樣做,但如何?

編輯1:

這裏是SaveTable功能的縮短版:

public string SaveTable(string[] function_param) 
{ 
    if (function_param != null && function_param > 0) 
    { 
     //some code     
     return "Success"; 
    } 

    //The following code will run if it's not successful. 
    return "There must be at least one country in the Region."; 
    //Yeah it's always returning this b/c function_param is null;   
} 
+2

控制器的外觀如何? –

+0

檢查您的請求負載以查看數據是否真的發送到控制器。 – Saravana

+0

@Mark我的控制器有ActionResult方法用於返回用於訪問數據庫的視圖和方法。這是一個用於根據傳入的數組訪問數據庫的函數。 – RedAces

回答

19

你需要序列化陣列時設置traditional: true

$.ajax({ 
    type: "POST", 
    traditional: true, 
    url: "../Home/SaveTable", 
    data: { function_param: countryArray } 
}); 

發現在這很好的解釋了什麼traditional: true做:https://stackoverflow.com/a/5497151/2419531

編輯:

如果你不想使用traditional: true,您可以使用JSON.stringify並指定傳遞數據串contentType

$.ajax({ 
    type: "POST", 
    url: "../Home/SaveTable", 
    contentType: 'application/json', 
    data: JSON.stringify({function_param: countryArray}), 
}); 
+0

我看着你的鏈接,那裏的答案暗示着傳統的方式已經過時,而新的方式更好。那麼使用傳統的序列化數組有什麼好處? – RedAces

+1

無論如何,它沒有工作,該函數仍然得到一個空字符串[]數組。 – RedAces

+0

查看我更新的答案。 – Saravana

2

您應該在您的控制器上使用:

public string SaveTable(object[] function_param) 
{ 
    //some code 
} 

應該做的工作,它是爲未來的用戶。

+1

一個很好的解決方案,謝謝。 – spadelives

0

您的Ajax:

$.ajax({ 
    type: "POST", 
    url: "../Home/SaveTable", 
    contentType: 'application/json', 
    data: {function_param: JSON.stringify(countryArray)}, 
}); 
在你的控制器

using Newtonsoft.Json; 

    public string SaveTable(string function_param) 
    { 
     dynamic func_param = JsonConvert.DeserializeObject(function_param) 
    } 

,那麼你就可以做一個foreach在你的控制器。

相關問題