我已经看到类似的情况我的回答,但我有特殊需要总是与其他问题不同。
我将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 但我真的不喜欢这个答案......只是为了封装字符串而创建一个对象非常脏......
答案 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) {
...
}
});