【发布时间】:2018-12-08 08:05:21
【问题描述】:
我在为 ASP.NET Core 2.1 Web API 服务编写自定义模型绑定器时遇到问题。我有一个如下的操作方法
public async Task<IActionResult> SaveAccountEvents([FromRoute] Guid accountId, IList<AccountEvent> events)
{
}
AccountEvent 类有很多属性,包括
[BindProperty(BinderType = typeof(CustomBinding))]
public string EventBody { get; set; }
目的是我希望来自客户端的此属性的值是字符串或 JObject (JSON)。这个想法是,客户端可以在 EventBody 中发送字符串化 JSON 或 JSON,模型会将其存储为字符串 - 最终以字符串化 JSON 的形式存储。
我遇到的问题是,在我的自定义绑定中,bindingContext.ValueProvider.GetValue 从不返回任何内容。查看属性,它只包含一个RouteValueProvider。我看不出有任何方法可以从身体中获取价值。是否有其他方法可以在 ASP.NET Core Web API 中自定义 JSON 反序列化?
更新:
客户端使用此 API 发送事件数据。事件数据由一个信封组成,其中包含事件名称、发送日期、发起事件的用户等。在当前版本中,实际事件数据作为字符串化 JSON 发送。所以现在,一个请求看起来像(注意事件主体是一个字符串):
{
"eventDate": "20180909",
"eventBody": "{
\"newLastName\": \"bob\",
\"primaryApplication\": \"bob\"
}"
}
变化是我希望能够将事件主体作为 JSON 接受。在这种情况下,客户端应该能够发送(注意事件主体是正确的 JSON):
{
"eventDate": "20180909",
"eventBody": {
"newLastName": "bob",
"primaryApplication": "bob"
}
}
这两种场景都需要支持,现有的API是字符串版本。我要做的是配置 API,以便如果发送的事件是 JSON 对象,它会在到达 Action 的模型中被字符串化。
【问题讨论】:
-
** 我希望来自客户端的此属性的值是字符串或 JObject (JSON) ** 你是什么意思? HTTP 请求将始终将您的 JSON 作为字符串包含在内,您对此无能为力。模型绑定器是可以将该字符串转换为 JObject 的模型绑定器,但是如果没有看到您的绑定器代码,我就忍不住了。
-
这个question 可能会有所帮助。
标签: c# asp.net-core model-binding asp.net-core-webapi json-deserialization