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

你可以让你的 post 方法接受一个 HttpRequestMessage 来绕过模型绑定逻辑,你可以直接读取请求的内容:

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

    }

顺便说一句,JObject 中的操作不起作用的原因是因为 'ObjectId("...")' 在您的数据中用作“_id”的值...

于 2012-11-26T22:09:26.143 回答
20

我们通过 jquery 传递 json 对象,并在动态对象中解析它。它工作正常。这是示例代码:

ajaxPost:

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

网络API:

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

    return name;
}

关于stackoverflow的类似问题: WebAPI Multiple Put/Post parameters

于 2013-01-24T02:45:36.277 回答
2

在您的输入中,"_id": ObjectId("5069f825cd4c1d590cddf206")是什么破坏了服务器上的 JSON 实现。删除ObjectId和使用"_id" : "5069f825cd4c1d590cddf206"作品与JObject以及Dictionary<string, object>

于 2012-11-26T22:17:09.333 回答
-6

这很简单,您只需要将 Accept Header 放入“application/json”。

于 2013-02-20T01:46:21.593 回答