gpt4 book ai didi

jquery - POST到Web API OData,接收到的实体为null

转载 作者:行者123 更新时间:2023-12-01 04:53:57 25 4
gpt4 key购买 nike

我正在尝试使用 OData 将数据发送到 Web API。但接收到的实体始终为空。

我使用 JQuery 进行了此调用:

        $.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 对象如下:

{"name":"苹果","description":"好!!","price":"12.3","category":"水果"}

我的 Controller 是:

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;
}
}

我也尝试使用 datajs-1.10.js 框架,但得到了相同的结果。

        OData.request(
{
requestUri: "/odata/Products",
method: "POST",
data: productToAdd
},
function (data) {
alert("Server call has been OK!!");
}
);

我认为反序列化 JSON 对象时出现了问题,但我不知道是什么。你能帮我吗?

谢谢!!

最佳答案

由于某种原因,Web api 的模型绑定(bind)器似乎没有按照我们期望的 mvc 中模型绑定(bind)的方式运行,但是这里的上下文略有不同,表单发布并不完全相同作为 JSON 对象有效负载...

例如:如果我在 C# 中定义以下类...

class Foo 
{
public int Id { get; set; }
public string Bar { get; set; }
}

...然后给出方法签名...

public void SomeMethod(Foo data) { ... }

...在 MVC 中,我可以发布任意数据 block ,并且任何至少匹配某些属性的数据都会被绑定(bind)。Web API 会发生这种情况,但前提是您发布“application/x-www-form-urlencoded”内容类型并且我对数据进行字符串化。

但是,如果您想发布正确的 JSON,则必须明确且正确,如果您提供少 1 个属性或一个额外属性,它将失败并出现模型状态验证错误,该错误非常模糊,只是显示类似“发布的数据”之类的内容验证失败”,没有帮助。

您应该能够通过在 Controller 的第一行放置断点然后检查 Modelstate 中的值来看到这一点。没有异常(exception),只是验证失败并且参数为空。

但是数据应该仍然存在,并且没有什么可以阻止您使用所需的 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
}
});

关于jquery - POST到Web API OData,接收到的实体为null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16221365/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com