使用MVC Web API发布和接收json

时间:2014-04-09 15:33:12

标签: c# json asp.net-web-api

我已经看到类似的情况我的回答,但我有特殊需要总是与其他问题不同。

我将json数据从我的html页面发送到MVC Web API。不幸的是,我收到的数据总是为空(我在这里尝试了很多不同的东西)。问题是我真的需要以json(字符串)的形式接收数据,因为我的数据非常复杂,并且无法通过Web API进行简单的反序列化(我有自己的自定义反序列化器)。

继承代码!

首先,将收到ajax post请求的web api控制器

public class ActivityController : ApiController
{
    // POST api/activity
    public string Post([FromBody]string json)
    {
    }
}

然后,ajax请求本身

$.ajax("/api/activity", {
    contentType: "application/json",
    data: { json: ko.mapping.toJSON(fusionedModel) },
    type: "POST",
    success: function (result) {
        ...
    }
});

就数据而言,它渲染得很好(我使用了与MVC(而不是Web Api)相同的请求,并且服务器正在完美地接收字符串...现在由于某种原因,在我的web api中控制器,“json”参数始终为空。正如我之前所说,重要的是我将数据作为json字符串接收。

编辑:我发现我的问题与此问题重复:POST JSON with MVC 4 API Controller 但我真的不喜欢这个答案......只是为了封装字符串而创建一个对象非常脏......

3 个答案:

答案 0 :(得分:2)

我建议您避免使用标准的body参数绑定,因为该机制假定您正在尝试将正文反序列化为CLR对象。试试这个,

public class ActivityController : ApiController
{
    // POST api/activity
    public async Task<HttpResponseMessage> Post(HttpRequestMessage request)
    {
         var jsonString = await request.Content.ReadAsStringAsync();

         return new HttpResponseMessage();
    }
}

如果你真的想使用参数绑定,你可以这样做。

    public HttpResponseMessage Post(JToken jToken)
    {

        return new HttpResponseMessage()
        {
            Content = new StringContent(jToken.ToString())
        };
    }

答案 1 :(得分:0)

请尝试使用可以在System.Web.Http上找到的[HttpPost]属性;

public class ActivityController : ApiController
{
    // POST api/activity
    [HttpPost]
    public string Post([FromBody]string json)
    {
    }
}

答案 2 :(得分:0)

我可能在这里错了,但看起来您还没有在帖子网址中包含您的操作。尝试更改

$.ajax("/api/activity", {
    contentType: "application/json",
    data: { json: ko.mapping.toJSON(fusionedModel) },
    type: "POST",
    success: function (result) {
        ...
    }
});

$.ajax("/api/activity/POST", {
    contentType: "application/json",
    data: { json: ko.mapping.toJSON(fusionedModel) },
    type: "POST",
    success: function (result) {
        ...
    }
});