2012-04-11 38 views
8

我有以下問題:MVC 3 AJAX後,列表填充對象,但對象屬性爲空

在按鈕單擊我POST一些數據到服務器。 我控制器操作是這樣的:

public ActionResult Accept(List<MyViewModel> entries) 
{ 
    //here entries HAS 2 MyViewModel-Instances in it. 
    //The entries are not null, but the values of the instances are! 
    //entries[0].ParamA is null 
} 

凡MyViewModel看起來是這樣的:

public class MyViewModel 
{ 
    public string ParamA { get; set; } 
    public string ParamB { get; set; } 
} 

而AJAX的呼叫是follwing:

var myEntries = { entries: [{ ParamA: "A", ParamB: "B" }, { ParamA: "C", ParamB: "D" }] }; 

$.ajax({ 
    type: 'POST', 
    url: url, 
    cache: false, 
    data: myEntries, 
    dataType: 'text' }); 

什麼我已經嘗試過要做:

  • 更改數據類型爲 'JSON'
  • 使用:傳統:真
  • 試圖變種myEntries = JSON.stringify(...);
  • 已嘗試var myEntries = {entries:[JSON.stringify({...}),JSON.stringify({...})]};
  • 與上面相同,但使用jQuery.param(...,true);
  • 使用IEnumerable或MyViewModel []代替列表。
  • 我在做什麼錯在這裏以上

的任意組合?

非常感謝你,非常提前幫助我!

編輯

我(剃刀)查看是不是在這個時刻,它無關什麼有趣的事。我沒有使用任何HTML.TextBoxFor(或類似的)方法來填充myEntries-Variable。它實際上是動態填充的(因爲有許多條件)。 爲了這個問題(和我自己的測試)我硬編碼變量。 :)

+0

您可以發佈您(剃刀)視圖的代碼? – 2012-04-11 07:55:35

+0

我的觀點沒有什麼有趣的地方。我在我的問題中明確了它。請參閱編輯部分 – Shion 2012-04-11 07:59:43

+0

我有答案!我會盡快發佈(必須等待8小時...) – Shion 2012-04-11 08:25:19

回答

12

隨着你的答案和使用JSON.stringify方法的工作對我來說

var myEntries = { entries: [{ ParamA: "A", ParamB: "B" }, 
          { ParamA: "C", ParamB: "D" }] }; 

$.ajax({ 
     type: 'POST', 
     url: '/{controller}/{action}', 
     cache: false, 
     data: JSON.stringify(myEntries), 
     dataType: 'json', 
     contentType: 'application/json; charset=utf-8' 
    }); 
+0

似乎我忘了說我也使用JSON.stringify。感謝您指出了這一點。 – Shion 2012-04-12 07:56:26

+0

謝謝,我的列表中有同樣的問題,但所有的屬性都是空的。我正在使用$ .Post(..),我認爲它只是一個包裝$ .ajax(類型:'POST',...),但是必須有一些區別,因爲使用上面的$ .ajax示例很好。 – 2013-04-19 15:26:19

+0

我只想強調一下,將contentType設置爲'application/json'是至關重要的。在我的情況下,沒有這個,它就無法工作! – 2013-09-13 12:26:49

5

我得到了答案!

jQuery有時會令人困惑。

dataType是指定要從服務器獲取BACK的參數。 contentType是指定您發送到服務器的參數。

所以從它上面工作,如果你添加例如:

的contentType:「應用/ JSON的; charset = utf-8',

在AJAX調用中。

1

只是恭維如何創建列表,這將是回發到控制器的答案。這是因爲你不需要用列表名稱來包裝數組。它看起來很醜,並且使用內置函數不可管理。這個例子在這裏展示瞭如何回發MVC將理解和解釋爲List的JSON。 (但即使數組被封裝,它仍然可以工作,但這是靜態內容,難以管理)

本示例使用jQuery的可排序插件。我想將整個列表模型返回到新的排序索引以保存在數據庫中。

update: function (event, ui) { 

img = { key: 0, order: 0, url: '' }; //Single image model on server 
imgs = new Array(); //An array to hold the image models. 

//Iterate through all the List Items and build my model based on the data. 
$('#UploaderThumbnails li').each(function (e) { 
     img.key = $(this).data('key'); //Primary Key 
     img.order = $(this).index(); //Order index 
     imgs.push(img); //put into "list" array 
}); 

//And what is in the answer - this works really great 
$.ajax({ 
    url: '/Image/UpdateOrder', 
    data: JSON.stringify(imgs), 
    type: 'POST', 
    contentType: 'application/json; charset=utf-8' 
    }); 

} 

我的MVC控制器就是這麼簡單...

[HttpPost] 
    public ActionResult UpdateOrder(List<Models.Image> images) 
    { 
    //Images at this point is a proper C# List of Images! :) Easy! 

     return Content(""); 
    } 
+0

這對我有效。只是重申,不要忘記application/json內容類型! – K0D4 2013-10-09 00:14:42