我正在尝试向服务器发出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
请求的正文未被正确解析。
有人可以帮我解决为什么会这样吗?非常感谢!
答案 0 :(得分:2)
您的post
方法有两种不正确之处:
<删除> 1。正如评论中已经说明的那样,您应该使用JSON.stringify
作为数据。(请参阅下面的更新)
2.第三个参数(如果存在)必须是success callback。
所以,这个变种应该有效:
...
$.post(url, JSON.stringify(body), function(results) {
self.results(results);
}, "json");
问题不在JSON.stringify
,因为默认情况下WEB Api支持application/x-www-form-urlencoded
,$post()
是CompareOperator
的默认内容类型。所以,我接下来猜测问题出在你的服务器模型上。确保MoreThanVal
,LessThanVal
和{{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 作为答案。