33

JSON を WebAPI コントローラーに投稿していますが、モデルのプロパティがバインドされていません。

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

生のリクエストは次のとおりです。

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.

ただし、JSON を次のように変更すると:

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

すべてが正しくバインドされます。

これは正しくないようです。パラメータとして受け入れて手動でバインドすることもできると思いJObjectますが、上記のように感じます Just Work (tm)?

アップデート:

モデルを返すようにメソッドを変更しましたが、まだ null を受け取ります。

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
4

5 に答える 5

18

以下は私にとって完全にうまくいきます:

モデル:

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}

ご覧のとおりUser、リクエストの JSON ペイロードにプレフィックスがなくても、すべてが適切にバインドされています。

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

于 2013-05-21T08:59:11.173 に答える
14

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

于 2016-11-14T21:31:43.397 に答える