2012-04-02 6 views
0

私は、JSONデータのアクションをasp.net mvc 3のパラメータにバインドすることを理解していますが、私は何も特別なことはありません。例えばJSonオブジェクトパラメータメンバーallways空/空

[HttpPost] 
public JsonResult Synchro(TestJSON data) 
{ 
    ... data member should contain the JSon data sent... 
    return Json("ok"); 
} 

TestJSONクラス:

public class TestJSON 
{ 
    public string chaine; 
    public int nombre; 
} 

とJSONデータ:

{chaine:"Test",nombre:"23"} 

(テスト用curl.exeで送信される)。しかしデータメンバーはいつもニューSyncho機能では11または0になります。

私は多くを検索しましたが、私は理解できません。

私は何か変わったことを発見しました。

var v = ValueProviderFactories.Factories.OfType<JsonValueProviderFactory>().First(); 
ValueProviderFactories.Factories.Remove(v); 

と私は(賭けのどこかにあります)私自身のモデルバインダー作成する場合:

public class JeanJsonModelBinder : IModelBinder 
{ 
    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) 
    { 
     if (!controllerContext.HttpContext.Request.ContentType.StartsWith("application/json", StringComparison.OrdinalIgnoreCase)) 
     { 
      // not JSON request 
      return null; 
     } 

     var request = controllerContext.HttpContext.Request; 
     var incomingData = new StreamReader(request.InputStream).ReadToEnd(); 

     if (String.IsNullOrEmpty(incomingData)) 
     { 
      // no JSON data 
      return null; 
     } 

     JavaScriptSerializer serializer = new JavaScriptSerializer(); 
     return serializer.Deserialize(incomingData, bindingContext.ModelType); 
    } 
    } 

と私は手動で私のパラメータをバインドする場合:

を私は(のApplication_Start中)JsonValueProviderFactoryを削除した場合
[HttpPost] 
public JsonResult Synchro([ModelBinder(typeof(JeanJsonModelBinder))] TestJSON data) 
{ 
    ... data member should contains JSon data sent... 
    return Json("ok"); 
} 

ありがとうございました

答えて

2

datamembersの代わりにモデルクラスのプロパティを使用してみてください。 私はあなたがデフォルトのモデルバインダーをあなたのものに置き換えると動作するかもしれませんが、これが標準のmoであるためにpropertysを使うべきだと思います。

+0

あなたは正しいです!私は少し愚かな気がする、私は何時間も費やさなかった。どうもありがとうございました ! – Factorial

+0

あなたは失敗するたびに、愚かな気持ちはしません。勉強する機会があれば、理論的にはもっとうまくいっていないでしょう。自分の投稿の隣にあるボタンをクリックして質問に答えてください。 ) –