2011-06-22 134 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