2012-11-14 28 views
3

我的模型大部分使用$('form').serializeArray()填充,但是需要從其管理器填充形成分頁網格的對象數組。 例如:具有複雜陣列的控制器中的綁定MVC模型

public JsonResult SubmitForm(MyViewModel input) 
{ 

...

public class MyViewModel 
{ 
    [Display(Name = "Name")] 
    public string GridName { get; set; } 

    [Display(Name = "Description")] 
    public string GridDescription { get; set; } 

    public GridRow[] GridRows { get; set; } 

的名稱和說明會由serializeArray()被拾起,也沒有問題。如果GridRowstring[],那麼它接受我只是推到它的多個實例進入系列化陣列的jQuery做:

var data = $('form').serializeArray(); 
for (var i in gridData) { 
    data.push({ name: 'GridRows', value: gridData[i].id }); 
} 
$.ajax({ 
    type: "POST", 
    url: '/Central/Results/SubmitForm', 
    dataType: "json", 
    data: data, 

這樣我至少可以得到的ID的數組。但是,當我想填充正確的數據類型時,它不允許我將整個對象推入它(gridData[i])。當它到達控制器時,我總是得到一個空值。

任何想法我需要如何處理數據以便MVC正確地填充模型?謝謝。

+0

如果你發送多行,那麼我會說你發送多個模型。您需要將您的控制器簽名更改爲公共JsonResult SubmitForm(IEnumerable input)' –

+0

模型中只有1個名稱和說明,但有很多行。所以它是一個模型中的許多模型。 – Tim

回答

0

原來只需要添加一行和屬性引用,並分別添加每個變量。

 for (var i in gridData) { 
      for (var j in gridData[i]) { 
       data.push({ name: 'GridRows[' + i + '].' + j, value: gridData[i][j] }); 
      } 
     } 

編輯:只是想我會發布我更新的幫助方法,我前一段時間寫了這個。

function serializeArray(obj, data, name) { 
    /// <summary>Turns an object into an MVC standard array of values </summary> 
    /// <param name="obj" type="Object">Object to serialise (required)</param> 
    /// <param name="data" type="Array">Array to append data to end of (optional)</param> 
    /// <param name="name" type="String">Name prefix for all entries (optional/ignore)</param> 

    if (!data || !(data instanceof Array)) { 
     data = []; 
    } 
    if (obj instanceof Array) { 
     if (!name) { 
     throw "Need an object name when converting an array"; 
     } 
     for (var index = 0; index < obj.length; index++) { 
     data = serializeArray(obj[index], data, name + '[' + index + ']'); 
     } 
    } else if (obj instanceof Object) { 
     for (var property in obj) { 
     if (obj.hasOwnProperty(property)) { 
      data = serializeArray(obj[property], data, name ? (name + '.' + property) : property); 
     } 
     } 
    } else { 
     data.push({ name: name, value: obj }); 
    } 
    return data; 
} 
1

我敢肯定,這與必須在您的Ajax帖子中將traditional選項設置爲true有關。就他們發佈到MVC控制器操作的方面而言,jQuery處理數組的方式與您預期的稍有不同。

所以做到這一點:

$.ajax({ 
    type: "POST", 
    url: '/Central/Results/SubmitForm', 
    dataType: "json", 
    traditional: true, 
    data: data, 
    ... 

詳情請參閱this answer

+0

沒有。這沒有幫助。 – Tim