Jquery 发布到Web API OData时,收到的实体为空
我正在尝试使用OData将数据发送到Web API。但是收到的实体总是空的 我使用JQuery进行了此调用:Jquery 发布到Web API OData时,收到的实体为空,jquery,post,asp.net-web-api,odata,Jquery,Post,Asp.net Web Api,Odata,我正在尝试使用OData将数据发送到Web API。但是收到的实体总是空的 我使用JQuery进行了此调用: $.ajax({ url: "/odata/Products", type: "POST", //contentType: "application/json;odata=verbose", contentType: 'application/json; charset=utf
$.ajax({
url: "/odata/Products",
type: "POST",
//contentType: "application/json;odata=verbose",
contentType: 'application/json; charset=utf-8',
data: JSON.stringify(productToAdd),
dataType: "json",
success: function () {
alert("Server call has been OK!!");
},
error: function () {
alert("Server call has been failed!!");
}
});
productToAdd对象类似于:
{“名称”:“苹果”,“描述”:“好!!”,“价格”:“12.3”,“类别”:“水果”}
我的控制器是:
public class ProductsController : EntitySetController<Product, string>
{
private IProductService _prodSvc;
public ProductsController(IProductService prodSvc)
{
_prodSvc = prodSvc;
}
[Queryable]
public override IQueryable<Product> Get()
{
return _prodSvc.GetAllProducts();
}
protected override Product CreateEntity(Product product)
{
var addedProduct = _prodSvc.AddProduct(product);
return addedProduct;
}
}
我认为当它反序列化JSON对象时有问题,但我不知道是什么。你能帮我吗
谢谢 出于某种原因,web api的模型绑定器的行为似乎与我们在mvc中的模型绑定所期望的不一样,但是这里的上下文略有不同,表单post与JSON对象负载并不完全相同 例如: 如果我在C#中定义以下类 。。。然后给出了一个方法签名
public void SomeMethod(Foo data) { ... }
。。。在MVC中,我可以发布任意的数据块,任何至少与某些属性匹配的数据都会被绑定。
这种情况发生在Web API中,但前提是您发布了“application/x-www-form-urlencoded”的内容类型,并且我对数据进行了字符串化
但是,如果您想发布正确的JSON,则必须明确且正确,如果您提供的属性少了1个或多了一个,则会出现modelstate验证错误,该错误非常模糊,只是说“发布的数据验证失败”,没有帮助
通过在控制器的第一行上放置一个断点,然后在Modelstate中检查该值,您应该能够看到这一点。
没有异常,只是验证失败且参数为null
但是,数据应该仍然存在,并且没有任何东西可以阻止您自己使用2或3行代码从请求流中手动解析数据。
在本例中,我建议您确认json与DTO完全匹配
如果是这样的话,这应该是可行的
$.ajax({
type: method,
url: url,
data: someObject,
dataType: 'json',
beforeSend: function (xhr) {
xhr.setRequestHeader("Content-Type", "application/json;odata=minimalmetadata");
xhr.setRequestHeader("Accept", "application/json;odata=minimalmetadata");
xhr.setRequestHeader("Accept-Charset", "UTF-8");
// add say auth headers here for secure endpoints
},
success: function (newObj) {
// job done
},
error: function (e) {
// nope, examine what server said
}
});
一般来说,我建议您在遇到这样的问题时,首先尝试确定问题是客户端问题还是服务器端问题。使用类似的工具(或任何其他监视HTTP请求和响应的工具)查看服务器返回的内容。服务器发送回的是成功的状态代码还是错误?能否检查控制器上的ModelState属性?应该有任何关于反序列化失败的信息。
public void SomeMethod(Foo data) { ... }
$.ajax({
type: method,
url: url,
data: someObject,
dataType: 'json',
beforeSend: function (xhr) {
xhr.setRequestHeader("Content-Type", "application/json;odata=minimalmetadata");
xhr.setRequestHeader("Accept", "application/json;odata=minimalmetadata");
xhr.setRequestHeader("Accept-Charset", "UTF-8");
// add say auth headers here for secure endpoints
},
success: function (newObj) {
// job done
},
error: function (e) {
// nope, examine what server said
}
});