2011-06-13 47 views
9

我得到控制器中的空值。不知道我錯過了什麼。如何將這個js數組傳遞給我的MVC 3控制器?

我有一個網格,我有一個訪客列表(名稱爲&電子郵件),其中用戶通過複選框選擇訪客。

然後我讀取所選聯繫人的名稱和電子郵件並構建js數組。 然後這個數組傳遞給MVC 3 controller

JS代碼:

var name ='', email=''; 
    var guest = new Array(); 
      var guests = new Array(); 
      $('.CBC').each(function() { //loop grid by checkbox class 
       if (this.checked) { 
        name = GetSelectedName(); 
        email = GetSelectedEmail(); 
        guest = { 'Email': email, 'Name': name }; 
        guests.push(guest); 
       } 
      }); 

     $.ajax({ 
     type: "POST", 
     url: GetURL(), 
     data: guests, 
     dataType: "json", 
     success: function (res) { 
      //do something 
     } 
}); 

控制器:

[HttpPost] 
    public ActionResult AddGuests(List<SelectedGuest> guests) 
    {    
     GuestService svc = new GuestService(); 
     //do something with guests 
     //But Name and Email of all items in guests are null!!! 
    } 

public class SelectedGuest 
{ 
    //represent the email columns of the contact grid 
    public string Email { get; set; } 

    //represent the Name column of the contact grid 
    public string Name { get; set; } 
} 

我需要JS數組顯式轉換爲JSON對象序列化呢?

+1

你怎麼在'串id'指定? – 2011-06-13 05:48:20

+0

Id是一個字符串。它得到正確傳遞。爲了清晰起見,我刪除了Id參數。 – kheya 2011-06-13 06:08:32

回答

3

如果你有使用插件的自由,嘗試jQuery-JSON

var guests = new Array(); 

// push stuff into the array 

$.ajax({ 
    type: "POST", 
    url: GetURL(), 
    data: $.toJSON(guests), 
    dataType: "json", 
    success: function (res) { 
     //do something 
    } 
); 
+0

這是最好的選擇嗎? – kheya 2011-06-13 06:57:43

+0

這就是我使用的。這很簡單直接。我可以考慮修改html的另一個選項,然後使用'serializeArray()'發佈到控制器。如果需要,我會詳細說明。 – 2011-06-13 07:23:47

+1

爲什麼jQuery插件json -.-只是使用'JSON.stringify' – Raynos 2011-06-13 07:35:16

4

也許改變設置傳統到真正可能的幫助。這裏是我修改過的代碼,用於將唯一標識符(Guid)發佈到控制器操作。

var yourArray = new Array(); 
// TODO: fill array with ids of checked checkboxes 
$('.CBC:checked').each(function() { 
    yourArray.push($(this).attr('myId')); 
}); 

var postData = { 
    yourArray: yourArray 
}; 

$.ajax({ 
    type: "POST", 
    url: "/ctrl/ActionName", 
    data: postData, 
    success: function (result) { 
    }, 
    datatype: "json", 
    traditional: true 
}); 

在控制器中,我有以下操作。

[HttpPost] 
public ActionResult ActionName(List<Guid> yourArray) 
{ 
    return View(); 
} 
+0

我的ajax調度器是通用的。我不喜歡傳統:除非這是我最後的選擇,否則只適用於這個用例。你的例子比較簡單,因爲它只有ID。我有另一個數組內的數組列表。 [{name:「」,email:「」},{},{}] – kheya 2011-06-13 07:06:42

0

您還可以創建自定義模型聯編程序。這使您可以將原始輸入中的代碼寫入請求對象,並從中創建一個對象。這可以讓你創建一個字符串列表或其他你想在控制器中看到的對象。它也是非常可重用的。

7
$.ajax({ 
      type: "POST", 
      url: "yourUrl", 
      data: JSON.stringify(yourArray), 
      contentType: "application/json; charset=utf-8" 
     }); 

的contentType: 「應用/ JSON的;字符集= UTF-8」 - 是很重要的一部分

[HttpPost] 
public void Fake(List<yourType> yourArray) 
{ 
} 
+0

這不適合我。當我設置contenType時,根本沒有數據通過! – M46 2018-02-07 14:14:45

1

,因爲你在發送錯誤的方式JSON數組你得到空。

首先,你應該序列的JSON數組:

$.ajax({ 
     // Whatever ... 
     type: "POST", 
     url: "yourUrl", 
     data: JSON.stringify(guests), 
     // Whatever ... 
    }); 

其次,你的控制器應得到的字符串:

[HttpPost] 
public ActionResult ActionName(string guests) 
{ 
    // ... 
} 

最後,你應該反序列化字符串相關類型:

[HttpPost] 
public ActionResult ActionName(string guests) 
{ 
    // this line eserializes guests ... 

    IList<GuestType> gs = 
     new JavaScriptSerializer().Deserialize<IList<GuestType>>(guests); 

    // ... Do whatever with gs ... 

    return View(); 
} 
0

我試過這個,它的工作。

var name ='', email=''; 
var guest = new Array(); 
     var guests = new Array(); 
     $('.CBC').each(function() { //loop grid by checkbox class 
      if (this.checked) { 
       name = GetSelectedName(); 
       email = GetSelectedEmail(); 
       guest = { 'Email': email, 'Name': name }; 
       guests.push(guest); 
      } 
     }); 

var PostData = { guests: guests }; //if this is creating ambiguity try using something:guest //(something is //controller parameter, change your controller parameter accordingly)    

    $.ajax({ 
    type: "POST", 
    url: GetURL(), 
    data: PostData , 
    dataType: "json", 
    success: function (res) { 
     //do something 
    } 
}); 

乾杯,

SRINIVAS

1

剛剛設置的「傳統:真正的」在阿賈克斯。

$.ajax({ 
    type: "POST", 
    url: GetURL(), 
    data: PostData , 
    dataType: "json", 
    traditional:true, 
    success: function (res) { 
     //do something 
    } 
}); 
相關問題