2011-06-22 15 views
1

私は整数とオブジェクトを含むjson配列を持っています。モデルAsp.Net MVCで異なるオブジェクト型を含むjson配列をバインド

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

また、私はサーバー側のパラメータにJSON配列を結合取り掛かる必要がありますどのように

class country { 
    string Name; 
    int Value; 
} 

次のサーバー側のクラスがありますか?私はサーバ上で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

関連する問題