来自 JSON 的 WebAPI 模型绑定

Posted

技术标签:

【中文标题】来自 JSON 的 WebAPI 模型绑定【英文标题】:WebAPI Model Binding from JSON 【发布时间】:2013-04-28 20:58:11 【问题描述】:

我正在使用 Durandal 创建一个应用程序,并将 WebAPI 作为服务器。我有一个 KendoUI 网格,可以正确显示来自服务器的数据并正常运行,直到调用 POST 或 PUT 方法。这是我的 GET 方法:

您可以看到该数据绑定到 UI(使用 Durandal 中的 data-bind extensibility 更改为剑道绑定):

然后我在 Grid 中编辑数据,并将请求中的更改传递给服务器,如您在此 Fiddler 结果中所见:

在服务器端,我无法获取从客户端传递的数据,以绑定到我作为 POST 或 PUT 方法的参数放置的任何内容。

我意识到这是几种不同的故障排除技术(例如 Durandal、KnockoutJs、Kendo DataBinding 和 WebAPI),但我认为基本原理是有效的,数据被检索并绑定到 UI 并在更改时回发,但 WebAPI 端点无法绑定到数据。

如何通过 WebAPI 中的 ModelBinding 结构获取传递的“模型”数组进行绑定?

更新 - 这是有用的 JSFiddle,它为我提供了要添加的正确 Content-Type:http://jsfiddle.net/Xhrrj/1/

new kendo.data.DataSource( transport: read: type: "POST", url: "../cccs/service.svc/SupplierSearch", contentType: "application/json; charset=utf-8", dataType: 'json'...

来自 Telerik 论坛 here

【问题讨论】:

根据示例提琴手请求,您正在发回数据但格式不正确,因此 Web.API 无法使用它。所以问题在于序列化数据的方式。因此,请发布您的保存更改方法的代码,或者您创建put 请求的位置。 它看起来好像是在混合 form-urlencoded 和 json 格式 - 它发送 models=,然后是 urlencoded JSON 对象。 @nemesv,我正在使用 KendoUI 的 javascript 函数,这里有一个我认为可能有用的 sn-p: parameterMap: function(options, operation) if (operation !== "read" && options.models) return models: kendo.stringify(options.models); - 链接docs.kendoui.com/getting-started/web/grid/editing -- 也在阅读这个,可能是改变 json 模型的一种方式,但不确定 -- docs.kendoui.com/getting-started/framework/datasource/overview @Joanna,您是最接近正确的,http 标头将字符串格式化为 - Content-Type: application/x-www-form-urlencoded;字符集=UTF-8。通过将以下内容放在我的 javascript 对象中用于 PUT 和 POST,我通过 -- contentType: "application/json; charset=utf-8" 获得了正确的数据。给个答案,我给你。 @John - 我很高兴它有帮助 【参考方案1】:

它看起来好像将 form-urlencodedjson 格式混合在一起 - 如果您查看它发送的解码字符串 models=,然后是 urlencoded JSON 对象。

【讨论】:

http 标头将字符串格式化为 -- Content-Type: application/x-www-form-urlencoded;字符集=UTF-8。通过将以下内容放在我的 javascript 对象中用于 PUT 和 POST,我通过 -- contentType: "application/json; charset=utf-8" 获得了正确的数据【参考方案2】:

根据我的经验,我认为您的 PUT 端点声明需要如下所示:

[HttpPut]
public void Put([FromBody]IEnumerable<Product> models)  

所以您需要 FromBody 属性,因为您的产品数组在正文中(我认为?)而不是在请求的 url 中。

【讨论】:

嗨,Alex,感谢您的回复,但您的回答并没有更改绑定值,实际上是我必须明确指定 Content-Type 标头以获取要在 API 中绑定的 JSON 数据方法。

以上是关于来自 JSON 的 WebAPI 模型绑定的主要内容,如果未能解决你的问题,请参考以下文章

WebAPI:HttpClient 响应字符串模型绑定

复杂抽象对象的WebAPI自定义模型绑定

net core 模型绑定与之前版本的不同-FromBody 必须对应Json格式

继承类型的 WebApi 模型绑定

Web API 无法使用 utf-16 编码的 XML 绑定 POST 模型

JSON 的 Knockout foreach 数据绑定不返回任何值