2011-06-22 132 views
1

我有一個包含整數和對象的json數組。模型在Asp.Net中綁定包含不同對象類型的json數組MVC

[1,2,3,{Name:"russia",Value:6},{Name:"usa",Value:"8"}] 

我也有以下的服務器端類

class country { 
    string Name; 
    int Value; 
} 

我應該如何去JSON數組綁定到服務器端的參數?我嘗試在服務器上使用List<object>。它可以很好地綁定整數,但不會創建任何國家/地區實例。相反,創建原始對象並將其添加到列表中。

謝謝。

+0

有沒有辦法通過創建自定義值提供程序來完成它? – Amrit

+0

這對於將數據傳遞到Flot圖表尤爲重要 - 整個數據系列是一個混合類型的數組,下面的第一個解決方案將無法工作。 –

回答

1

好的,我終於解決了。我創建了一個從默認模型綁定器派生的自定義模型綁定器來實現這一點。這是代碼。

public ActionResult Home(NonHomogeneousList input) 

[ModelBinder(typeof(CustomModelBinder))] 
class NonHomogeneousList : List<object> 

public class CustomModelBinder : DefaultModelBinder 
{ 
    public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) 
     { 
      NonHomogeneousList model = (NonHomogeneousList)base.BindModel(controllerContext, bindingContext); 
      if (model.Members != null) 
      { 
       IModelBinder countryBinder = Binders.GetBinder(typeof(Country)); 

      // find out if the value provider has the required prefix 
      bool hasPrefix = bindingContext.ValueProvider.ContainsPrefix(bindingContext.ModelName); 
      string prefix = (hasPrefix) ? bindingContext.ModelName + "." : ""; 

      for (var i = 0; i < model.Count; i++) 
      { 
       var member = model.Members[i]; 
       if (member.GetType().Equals(typeof(object))) 
       { 
        var subKey = CreateSubIndexName(prefix , i); 
        ModelBindingContext innerContext = new ModelBindingContext() 
        { 
         ModelMetadata = ModelMetadataProviders.Current.GetMetadataForType(null, typeof(Country)), 
         ModelName = subKey, 
         ModelState = bindingContext.ModelState, 
         PropertyFilter = bindingContext.PropertyFilter, 
         ValueProvider = bindingContext.ValueProvider, 
        }; 
        var country = countryBinder.BindModel(controllerContext, innerContext); 
        model.Members[i] = country; 
       } 
      } 
     } 
     return model; 
    } 
} 
} 
1

你可以嘗試這樣的事:

格式控制器行動接受你的整數值爲你的國家對象List<int>List<Country>

public ActionResult Index(List<int> intValues, List<Country> countryValues) 

然後建立自己的JSON等,使得它包含與整數數組和國家的數組對象:

var postData = { 
    intValues: [1, 2, 3], 
    countryValues: [ 
     { Name: 'USA', Value: 6 }, 
     { Name: 'Russia', Value: 8 } 
    ] 
}; 

,並執行一個簡單的AJAX調用發送數據

$(function() { 
    $.ajax({ 
     type: 'POST', 
     url: "@Url.Action("Create")", 
     contentType: "application/json", 
     data: JSON.stringify(postData) 
    }); 
}); 
+0

感謝您的回覆克。我知道這個解決方案。我想知道是否有重寫默認模型綁定行爲來獲取列表的方法。只要國家實例被創建並上傳到「對象」,我就沒問題。 – Amrit