31

json オブジェクトを webapi コントローラー (POST) に渡し、それをマップするクラスを持たに、任意のコンテンツとして処理するにはどうすればよいですか?

したがって、クライアントから次のように渡すと:

        createRecord: function (model, data, callback, callbackParams) {
        var request = jQuery.ajax({
            type: "POST", // default = GET,
            url: '/api/' + model + '/',
            data: data,
            contentType: 'application/json',
            success: function (msg) {
                $('#results').text(msg);
                if (callback) // only fire a callback if it has been specified
                    callback(msg, callbackParams);
            },
            error: function (jqXHR, textStatus) {
                alert('Request failed: ' + textStatus);
            }
        });
    }

そしてデータは次のようなものです:

{ "_id" : ObjectId("5069f825cd4c1d590cddf206"), "firstName" : "John", "lastName" : "Smith", "city" : "Vancouver", "country" : "Canada" }

私のコントローラはそれを解析できますか? 次回は、データがその署名と一致しない可能性があります (例:

{ "_id" : ObjectId("5069f825cd4c1d56677xz6"), "company" : "Acme" }

私のコントローラーで、私は試しました:

public HttpResponseMessage Post([FromBody]JObject value)

と:

public HttpResponseMessage Post([FromBody]string value)

そして(これは実際にはmongo dbで動作するためです):

public HttpResponseMessage Post([FromBody]BsonDocument value)

しかし、オブジェクトマッパーは文字列以外のものにマップしたいようです...

4

4 に答える 4

25

モデル バインディング ロジックをバイパスするために HttpRequestMessage を受け取るポスト メソッドを作成し、リクエストの内容を直接読み取ることができます。

    public HttpResponseMessage Post(HttpRequestMessage req)
    {
        var data = req.Content.ReadAsStringAsync().Result; // using .Result here for simplicity...
        ...

    }

ちなみに、JObjectで取るアクションが動かないのは、データの「_id」の値に「ObjectId("...")」が使われているためです...

于 2012-11-26T22:09:26.143 に答える
20

json オブジェクトを jquery で渡し、動的オブジェクトでパースします。それは正常に動作します。これはサンプルコードです:

ajaxPost:

...
Content-Type: application/json,
data: {
          "name": "Jack", 
          "age": "12"
      }
...

ウェブアピ:

[HttpPost]
public string DoJson2(dynamic data)
{
    string name = data.name;
    int age = data.age;

    return name;
}

stackoverflow に関する同様の質問: WebAPI 複数の Put/Post パラメータ

于 2013-01-24T02:45:36.277 に答える
2

あなたの入力で"_id": ObjectId("5069f825cd4c1d590cddf206")は、サーバー上のJSONマテリアライゼーションを壊しているものです。の削除ObjectIdと使用"_id" : "5069f825cd4c1d590cddf206"JObjectDictionary<string, object>

于 2012-11-26T22:17:09.333 に答える
-6

Accept ヘッダーを「application/json」に配置するだけです。

于 2013-02-20T01:46:21.593 に答える