2014-04-23 32 views
7

我建立在JavaScript對象的數組,並希望通過Ajax(IM使用jQuery)Asp.Net MVC 4在成形後的對象數組自動綁定模型

JavaScript對象後他們回到服務器數組是這樣的:

var columns = [ 
    { name: 'col 1', source: 'whatever', hidden: false, width: 50 }, 
    ... 
]; 

進出口張貼回這樣的:

$.post('/MyController/MyAction', { 'columns': columns }); 

在控制器動作即時通訊目前得到這個:

enter image description here

我有一個C#對象調用JqColumn,我想後到綁定,它看起來像這樣:

public class JqGridColumn 
{ 
    public string name; 
    public string source; 
    public int width; 
    public bool hidden; 
} 

所以我認爲,在JqGridColumn[] columns類型的控制器動作添加參數將自動綁定發佈數據,但它不(它會產生一個陣列,具有正確數量的元素,但數組中的每個項目都有空值)

誰能告訴我什麼林做錯了什麼?謝謝!

UPDATE

目前,我手動綁定在我的控制器行動的項目如下:

public void ColumnChooser(JqGridColumn[] columns) 
    { 
     for (int i = 0; i < columns.Length; i++) 
     { 
      columns[i].hidden = bool.Parse(Request.Form["columns[" + i + "][hidden]"]); 
      columns[i].width = int.Parse(Request.Form["columns[" + i + "][width]"]); 
      columns[i].name = Request.Form["columns[" + i + "][name]"]; 
      columns[i].source = Request.Form["columns[" + i + "][source]"]; 
     } 
     return; 
    } 

...這工作得很好,但我真的很想知道.Net MVC(正確)的方式來做到這一點!

+0

您是否嘗試過讓你JqGridColumn對象的字段放入屬性(即,添加一個獲取並設置),因爲它聽起來模型綁定無法找到字段 –

+0

試過,仍然沒有喜悅我害怕... :( – Jimbo

+0

您是否嘗試過使用WebApi控制器,模型綁定可能會使用WebAPI控制器作爲默認的MVC綁定(我認爲)取決於將HTML元素髮回到FormCollection中。 –

回答

10

由於您沒有註冊爲JqGridColumn類型的特定ModelBinder,將使用DefaultModelBinder。但是:

  • 它不會綁定字段,只是公共屬性。

  • 陣列綁定的預期格式是columns[0].name,而實際上發佈的是columns[0][name]

的問題可以迎刃而解,如果你只是把你的columnsJSON格式而非名稱 - 值對

$.ajax({ 
    url: '/MyController/MyAction', 
    method: 'POST', 
    contentType: 'application/json', 
    data: JSON.stringify({ columns: columns }) 
}); 

然而,如果你不喜歡改變你的班級,你可以註冊一個ModelBinder特定的JqGridColumn,並使其即使與領域和當前的jQuery序列化工作:

public class JqGridColumnBinder : DefaultModelBinder 
{ 
    protected override object CreateModel(ControllerContext controllerContext, ModelBindingContext bindingContext, Type modelType) 
    { 
     string name = bindingContext.ValueProvider.GetValue(bindingContext.ModelName + "[name]").AttemptedValue; 
     string source = bindingContext.ValueProvider.GetValue(bindingContext.ModelName + "[source]").AttemptedValue; 
     int width = (int)bindingContext.ValueProvider.GetValue(bindingContext.ModelName + "[width]").ConvertTo(typeof(int)); 
     bool hidden = (bool)bindingContext.ValueProvider.GetValue(bindingContext.ModelName + "[hidden]").ConvertTo(typeof(bool)); 

     return new JqGridColumn 
     { 
      name = name, 
      source = source, 
      width = width, 
      hidden = hidden 
     }; 
    } 
} 

然後將其註冊在App_Start/ModelBindingConfig.cs

binders.Add(typeof(JqGridColumn), new JqGridColumnBinder()); 
+0

謝謝:)沒有想要使用自定義模型聯編程序,所以JSON.stringify爲勝利! – Jimbo

0

這是因爲你的JqGridColumn對象需要的屬性,而不是字段。請參閱參考這個問題:

ASP.net MVC - Model binding excludes class fields?

+0

感謝您的參考。不幸的是,即使JqGridColumn變量改變爲屬性,它們仍然沒有被綁定。 – Jimbo

+1

您可以嘗試將其更改爲'List '而不是數組。我不認爲這會幫助你獲得正確數量的項目。 –

+0

關於它可能工作的機會,我嘗試更改爲一個List 但仍然沒有約束力:( – Jimbo

0

嘗試後回用傳統:真正的設置 和數據類型:JSON

$.ajax({ 
    url: '/MyController/MyAction', 
    method: 'POST', 
    traditional: true, 
    dataType: json 
    data: columns ,    
    sucess: function() { alert('Success'); } 
}); 
+0

即使有此更改,表單發佈仍然可以看到控制器相同。 – Jimbo