$ .post(...)无法识别JSON正文

时间:2014-08-07 14:45:33

标签: javascript jquery asp.net-mvc json knockout.js

我正在尝试向服务器发出POST请求,如下所示:

var body = {
    PatientAgeFilter: {
        CompareOperator: parseInt(self.patientAge()),
        MoreThanVal: {
            AgeSpecifier: 0,
            AgeValue: parseInt(self.patientAgeLow())
        },
        LessThanVal: {
            AgeSpecifier: 0,
            AgeValue: parseInt(self.patientAgeHigh())
        }
    }
};

$.post(url, body, self.results, "json").done(function () {
    console.log("request done!");
    console.log(self.results());
});

网址设置正确,self.results Knockout.JS observableArray(),正文设置如上。

服务器端,这是处理请求的代码:

[HttpPost]
public IQueryable<Measurement> GetMeasurements(MeasurementQuery queryOptions)
{
    ...
    if (queryOptions != null) {
        if (queryOptions.PatientAgeFilter.CompareOperator != CompareOperator.Any) {
            ...
        }
    }
}

我在if (queryOptions != null)上设置了一个断点,queryOptions不为null。但queryOptions的内容保持默认,即使我在body中指定字段(fe CompareOperator应该等于3,但它保持为0 - 等于CompareOperator.Any),所以POST请求的正文未被正确解析。

有人可以帮我解决为什么会这样吗?非常感谢!

2 个答案:

答案 0 :(得分:2)

您的post方法有两种不正确之处:
<删除> 1。正如评论中已经说明的那样,您应该使用JSON.stringify作为数据。(请参阅下面的更新)
2.第三个参数(如果存在)必须是success callback

所以,这个变种应该有效:

...
$.post(url, JSON.stringify(body), function(results) {
    self.results(results);
}, "json");

更新1:

问题不在JSON.stringify,因为默认情况下WEB Api支持application/x-www-form-urlencoded$post()CompareOperator的默认内容类型。所以,我接下来猜测问题出在你的服务器模型上。确保MoreThanValLessThanVal和{{1}}实际上是属性,而不是字段(以及您要绑定的所有子项)。 WEB API不绑定字段。

答案 1 :(得分:1)

问题是 - 我认为 - 请求正文没有正确地通过服务器。我改变了这个

$.post(url, body, self.results, "json");

以下

$.ajax({
    url:url,
    type:"POST",
    data:JSON.stringify(body), //necessary for the data to be parsed properly
    contentType:"application/json; charset=utf-8", //important!
    dataType:"json",
    success: function(results){
        self.results(results);
    }
});

现在它可以正常工作。

我使用 this SO question 作为答案。