来自 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-urlencoded
与 json
格式混合在一起 - 如果您查看它发送的解码字符串 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 模型绑定的主要内容,如果未能解决你的问题,请参考以下文章
net core 模型绑定与之前版本的不同-FromBody 必须对应Json格式