2012-01-30 13 views
6

ASP.NET MVC3コントローラアクションメソッドにいくつかのJSONデータを送信しようとしていますが、何をしても機能しません。JSONデータをコントローラアクションに送信するASP.NET MVC

POST http://localhost:51492/Home/GetData HTTP/1.1 
Host: localhost:51492 
Connection: keep-alive 
Content-Length: 171 
Origin: http://localhost:51492 
X-Requested-With: XMLHttpRequest 
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.7 (KHTML, like Gecko)  Chrome/16.0.912.75 Safari/535.7 
Content-Type: application/json; charset=UTF-8; 
Accept: application/json, text/javascript, */*; q=0.01 
Referer: http://localhost:51492/ 
Accept-Encoding: gzip,deflate,sdch 
Accept-Language: en-GB,en-US;q=0.8,en;q=0.6 
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3 

{"Filters":[{"Field":3,"Operator":0,"Values":["30.01.2012.","30.01.2012."]},{"Field":2,"Operator":0,"Values":["-1"]},{"Field":0,"Operator":0,"Values":["some-string"]}]} 

私のC#コード:

$.ajax({ 
     url: '/Home/GetData', 
     type: "POST", 
     dataType: "json", 
     contentType: "application/json; charset=utf-8;", 
     data: JSON.stringify(filters_data), 
     success: function (data) { 
      alert(data); 
     } 
    }); 

フィドラーは、このような要求を示しています。ここ

は私のAJAX呼び出しである(それは json2.jsからJSON.stringifyメソッドを使用しています)
[HttpPost] 
public string GetData(QueryFilters filters) 
{ 
    return "Ho ho ho and a bottle of rum."; 
} 

[Serializable] 
public enum Fields 
{ 
     A, 
     B, 
     C, 
     D 
} 

[Serializable] 
public enum FilterOperator 
{ 
    Is, 
    Between, 
    GreaterOrEqual, 
} 

[Serializable] 
public class QueryFilter 
{ 
    public Fields Field { get; set; } 
    public FilterOperator Operator { get; set; } 
    public List<string> Values { get; set; } 
} 

[Serializable] 
public class QueryFilters 
{ 
    public List<QueryFilter> Filters { get; set; } 
} 

global.asax.csのApplication_Start()メソッドに次の行を追加しました:

ValueProviderFactories.Factories.Add(new JsonValueProviderFactory()); 

アクションメソッド 'GetData'のブレークポイントはヒットしますが、Filtersプロパティの値はnullです。何か案は?

もう1つの注意:私ははるかに単純なオブジェクトを渡してみました:Person - properties string Nameとint Age - 同じ結果を示します - 自動モデル結合が動作していないように見えますが、それを確認する方法。

答えて

5

問題は、あなたのアクション引数がfiltersと呼ばれ、QueryFiltersモデル内にデフォルトモデルバインダーを混乱させるFiltersというプロパティがあります。

だから、単にあなたのアクションの引数名前変更:

[HttpPost] 
public ActionResult GetData(QueryFilters model) 
{ 
    return Json("Ho ho ho and a bottle of rum."); 
} 

ああとアクションがActionResultsない文字列を返す必要があることに気づきます。

また、あなたのglobal.asaxから次の行を削除:

ValueProviderFactories.Factories.Add(new JsonValueProviderFactory()); 

ASP.NET MVC 3は既にこの内蔵しています。

それとも絶対に何らかの理由場合は、あなたのaction引数がfiltersと呼ばれる、あなたはまた、あなたがこれに送っているJSONリクエストを修正することができる持っている必要があります:

data: JSON.stringify({ 
    filters: { 
     Filters: [ 
      { "Field": 3, "Operator": 0, "Values": ["30.01.2012.", "30.01.2012."] }, 
      { "Field": 2, "Operator": 0, "Values": ["-1"] }, 
      { "Field": 0, "Operator": 0, "Values": ["some-string"] } 
     ] 
    } 
}), 

今、これ以上のあいまいさがありません。

+0

+1よく目に付きます。私は私の答えで参照したものを見つけることができなかったので、それを削除しました... –

+0

ありがとうございました!私はどれほど欲求不満を抱いているのか、何十億もの違うことを試してみることができず、簡単な命名の問題であることが分かりました。 – skali

+0

まあまあ、私は遠くにこれを見てきましたが、もちろん、それはスタックにあります! –