Jsonオブジェクトをwebapiコントローラー(POST)に渡し、notにマップするクラスを持ち、任意のコンテンツとして処理する方法はありますか?
クライアントから次のように渡した場合:
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)
しかし、オブジェクトマッパーが文字列以外のものにマッピングしたいようです...
モデルバインディングロジックを渡すことでHttpRequestMessageを受け取るpostメソッドを使用し、リクエストのコンテンツを直接読み取ることができます。
public HttpResponseMessage Post(HttpRequestMessage req)
{
var data = req.Content.ReadAsStringAsync().Result; // using .Result here for simplicity...
...
}
ところで、JObjectで実行するアクションが機能しない理由は、データの「_id」の値として使用される「ObjectId( "...")」が原因です...
Jqueryでjsonオブジェクトを渡し、動的オブジェクトで解析しました。正常に動作します。これはサンプルコードです。
ajaxPost:
...
Content-Type: application/json,
data: {
"name": "Jack",
"age": "12"
}
...
webapi:
[HttpPost]
public string DoJson2(dynamic data)
{
string name = data.name;
int age = data.age;
return name;
}
stackoverflowに関する同様の質問: WebAPI Multiple Put/Post parameters
入力では、"_id": ObjectId("5069f825cd4c1d590cddf206")
がサーバー上のJSONマテリアライゼーションを破壊します。 ObjectId
を削除して"_id" : "5069f825cd4c1d590cddf206"
を使用すると、Dictionary<string, object>
と同様にJObject
でも機能します