2013-05-21 18 views
28

JSONをWebAPIコントローラにポストしますが、モデルのプロパティはバインドされていません。私は見つけることができますWebAPI POST [FromBody]バインドされていません

POST http://diva2.local/siteapi/User HTTP/: diva2.local 
Connection: keep-alive 
Content-Length:: application/json, text/plain, */* 
Origin: http://diva2.local 
X-Requested-With: XMLHttpRequest 
User-Agent: Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.: application/json;charset=UTF: http://diva2.local/Users 
Accept-Encoding: gzip,deflate,sdch 
Accept-Language: en-US,en;q=: ISO-8859-1,utf-8;q=0.7,*;q=: .ASPXAUTH=4; __RequestVerificationToken=Rp_hUysjwCjmsxw2 

{"Id":3,"FirstName":"DIVA2","LastName":"User1","Username":"diva1","IsApproved":true,"IsOnlineNow":true,"IsChecked":true} 

すべての例では、これは動作するはずです私に語ったが、model.Id == null次のように

public void Post([FromBody] Models.Users.User model) { 
    throw new Exception(model.Id.ToString()); 
} 

生の要求があります。

はしかし、私はJSONを変更した場合:

{User: {"Id":3,"FirstName":"DIVA2","LastName":"User1","Username":"diva1","IsApproved":true,"IsOnlineNow":true,"IsChecked":true}} 

すべてが正常にバインドします。

これは正しくないようです。私はパラメータとしてJObjectを受け入れることができたと思うし、手動でそれをバインドするが、上記のようにちょうど仕事(TM)を感じる?

更新:

私はモデルを返すようにする方法を変更した、と私はまだヌル受けます。

public Models.Users.User Post(Models.Users.User user) { 
    return user; 
} 

と応答:私のために完全に罰金

HTTP/1.1 200 OK 
Cache-Control: no-cache 
Pragma: no-cache 
Content-Type: application/json; charset=utf-8 
Expires: -1 
Server: Microsoft-IIS/8.0 
X-AspNet-Version: 4.0.30319 
X-MiniProfiler-Ids: ["a0fab514-d725-4d8f-9021-4931dc06ec4a","fdeeb9a8-9e36-41d8-91d3-5348e880e193","c1b4cc86-d7c3-4497-8699-baac9fa79bf1"] 
X-Powered-By: ASP.NET 
Date: Tue, 21 May 2013 09:06:00 GMT 
Content-Length: 4 

null 
+1

Userのクラス定義を表示できますか? –

+3

#facepalm。パラメータなしのコンストラクタはありません。洞察に満ちた例外のための歓声.net! – mattdwen

+1

疑問を削除するようなことはありますか? – mattdwen

答えて

5

私のユーザーモデルには、パラメータのないコンストラクタはありませんでした。

+0

これも私の問題を解決しました。私はパラメータを必要とするコンストラクタを持っていて、すべての引数に対してnullを受け取っていました。空白でパラメータのないコンストラクタを追加すると、問題が解決されました。 –

17

次作品:

モデル:

public class User 
{ 
    public int Id { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public string Username { get; set; } 
    public bool IsApproved { get; set; } 
    public bool IsOnlineNow { get; set; } 
    public bool IsChecked { get; set; } 
} 

コントローラー:

public class ValuesController : ApiController 
{ 
    public User Post(User user) 
    { 
     return user; 
    } 
} 

要求:

POST http://example.com/api/values HTTP/1.1 
Connection: keep-alive 
Accept: application/json, text/plain, */* 
Content-Type: application/json;charset=UTF-8 
Host: localhost:8816 
Content-Length: 125 

{"Id":3,"FirstName":"DIVA2","LastName":"User1","Username":"diva2user1","IsApproved":true,"IsOnlineNow":true,"IsChecked":true} 

応答:

HTTP/1.1 200 OK 
Cache-Control: no-cache 
Pragma: no-cache 
Content-Type: application/json; charset=utf-8 
Expires: -1 
Server: Microsoft-IIS/8.0 
Date: Tue, 21 May 2013 08:59:02 GMT 
Content-Length: 125 

{"Id":3,"FirstName":"DIVA2","LastName":"User1","Username":"diva2user1","IsApproved":true,"IsOnlineNow":true,"IsChecked":true} 

あなたはすべてのものを見ることができるようにバインドされた罰金と要求JSONペイロード内のUser接頭辞なしダンディです。

idは、ルート定義でルートの一部として使用している場合は特別な意味があるため、model.Idには注意してください。 2つのことを混同しないでください(ルートパラメータとリクエストボディペイロードからのもの)。

+0

私はあなたの例のように、POSTされたモデルを返すようにメソッドを変更しましたが、まだヌルを受けています – mattdwen

+2

私のサンプルをステップバイステップに従います。モデル(私の答えに示されているように)APIコントローラを追加する(私の答えに示されているように)Fiddlerを使って、このコントローラを私の答えに示されているペイロードを使って呼び出します。すべての問題。 –

+2

これは正解です問題は、{User:}ラベルをリクエストに含めてはならないということです.Userオブジェクト自体がルートである必要があります。 –

24

ご要望にコンテンツタイプヘッダーがありません。

残念ながら、ModelStateを確認しても、エラー情報は表示されません。しかし、良いことは、今後のリリースでこの動作が修正され、415のステータスコードベースの応答が表示されることです。

Web APIでは、アクションのパラメータに本文を逆シリアル化するための正しいフォーマッタを見つけるためにContent-Typeヘッダが必要です。

+1

'Content-Type:application/json; charset = utf-8は無効ですか? – mattdwen

+1

h上記の元の投稿からは、Content-Typeヘッダがなく、 'Content-Length :: application/json、text/plain、*/*'のようなものがありました。また、モデルの状態エラーがあるかどうかをチェックしようとしましたか?このチェックを追加して、 'if(!ModelState.IsValid) { (HttpStatusCode.BadRequest、this.ModelState )); } ' –

+0

若干異なるトピックですが、 'contentType'の追加: 'application/json; charset = utf-8 'をjquery ajaxの投稿に寄付しました。だからcontentTypeが私に大きな違いをもたらしました。コントローラーで正しくルーティングされていましたが、データパラメーターは常に空でした(現在まで)。 –

関連する問題